K-01BFS(2023河南萌新联赛第(五)场:郑州轻工业大学)

这篇具有很好参考价值的文章主要介绍了K-01BFS(2023河南萌新联赛第(五)场:郑州轻工业大学)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

思路:

直接枚举这个图中的拐点

这个拐点是经过左右平移到上下平移或者上下平移到左右平移

假设这个点事左到右后然后再从下到上

左到右就相当于走了个最长上升子序列,然后再从下到上

从下到上的过程你可以反过来看,就是从上走到下,就相当从上到下走了个最长下降子序列

然后最长上升/下降子序列可以用dp+二分来求

按题解的话来说就是

预处理出对于每个单元格四个方向上最多跳多少个单元格可以跳到当前单元格(最长上升子序列),以及从当前单元格跳出最多能跳多少个单元格(最长下降子序列)

-----------------------------------

下面是最长上升子序列的代码

memset(q,0x3f,sizeof q);
	q[0]=-inf;
	int maxx=0;
for(int i=0;i<n;i++){
		int pos=lower_bound(q,q+n,a[i])-q-1;
		q[pos+1]=a[i];
		maxx=max(maxx,pos+1);
	}

最长下降子序列代码

for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	dp.push_back(v[0]);
	for (int i = 1; i < n; i++) {
		if (v[i] < dp.back()) dp.push_back(v[i]);
		else {
			int l = 0, r = dp.size()-1;
			while (l < r) {
				int m = l + (r - l) / 2;
				if (v[i] < dp[m])l = m + 1;
				else r = m;
			}
			dp[l] = v[i];
		}

-------------------

经过每个点4个方向的预处理文章来源地址https://www.toymoban.com/news/detail-643071.html

#include<iostream>
#include<algorithm>
#include<numeric>//accumulate(be,en,0)
#include<cstring>//rfind("string"),s.find(string,begin)!=s.npos,find_first _of(),find_last_of()
#include<string>//to_string(value),s.substr(int begin, int length);
#include<cstdio>
#include<cmath>
#include<vector>//res.erase(unique(res.begin(), res.end()), res.end()),reverse(q.begin(),q.end()),vector<int>().swap(at[mx])
#include<queue>//priority_queue(big)  /priority_queue<int, vector<int>, greater<int>> q(small)
#include<stack>
//#include<map>//unordered_map
#include<set>//iterator,insert(),erase(),lower(>=)/upper_bound(>)(value)/find()return end()
#include<unordered_map>
#include<unordered_set>
#include<bitset>//size,count(size of 1),reset(to 0),any(have 1?)
//#include<ext/pb_ds/assoc_container.hpp>//gp_hash_table
//#include<ext/pb_ds/hash_policy.hpp>
//using namespace __gnu_pbds;
#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
using namespace std;
const int inf = 0x3f3f3f3f3f3f3f3f, N = 1e5 + 5, mod = 1e9 + 7;
signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while (T--) {
		int n, m;
		cin >> n >> m;
		vector<vector<int>>q(n + 5, vector<int>(m + 5));//存储原来矩阵
		vector<vector<int>>q2(n + 5, vector<int>(m + 5));//存储第一次上下移动的矩阵的最大值
		vector<vector<int>>q1(n + 5, vector<int>(m + 5));//存储第一次左右移动的矩阵的最大值
		vector<vector<int>>q3(n + 5, vector<int>(m + 5));//存储第二次上下移动的矩阵的最大值
		vector<vector<int>>q4(n + 5, vector<int>(m + 5));//存储第二次左右移动的矩阵的最大值
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				cin >> q[i][j];
			}
		}
		vector<int>w, tmp(m + 5), tmp2(n + 5);
		for (int i = 1; i < m + 5; i++) tmp[i] = inf;
		for (int i = 1; i < n + 5; i++) tmp2[i] = inf;
		for (int i = 1; i <= n; i++) {//求每一行从左到右的最长上升子序列
			w = tmp;
			w[0] = -inf;
			for (int j = 1; j <= m; j++) {
				int pos = lower_bound(w.begin(), w.end(), q[i][j]) - w.begin() - 1;
				w[pos + 1] = q[i][j];
				q1[i][j] = pos + 1;
			}
		}
		for (int i = 1; i <= n; i++) {
			w = tmp;
			w[0] = -inf;
			for (int j = m; j >= 1; j--) {
				int pos = lower_bound(w.begin(), w.end(), q[i][j]) - w.begin() - 1;
				w[pos + 1] = q[i][j];
				q1[i][j] = max(q1[i][j], pos + 1);
			}
		}
		for (int i = 1; i <= m; i++) {//每一行从右到左 的上升子序列(下面同理)
			w = tmp2;
			w[0] = -inf;
			for (int j = 1; j <= n; j++) {
				int pos = lower_bound(w.begin(), w.end(), q[j][i]) - w.begin() - 1;
				w[pos + 1] = q[j][i];
				q2[j][i] = pos + 1;
			}
		}
		for (int i = 1; i <= m; i++) {
			w = tmp2;
			w[0] = -inf;
			for (int j = n; j >= 1; j--) {
				int pos = lower_bound(w.begin(), w.end(), q[j][i]) - w.begin() - 1;
				w[pos + 1] = q[j][i];
				q2[j][i] = max(q2[j][i], pos + 1);
			}
		}
		//------------------------

		for (int i = 1; i <= n; i++) {//每一行从左到右的下降子序列
			q3[i][1] = 1;
			vector<int>dp;
			dp.push_back(q[i][1]);
			for (int j = 2; j <= m; j++) {
				if (q[i][j] < dp.back()) {
					dp.push_back(q[i][j]); q3[i][j] = dp.size();
				}
				else {
					int l = 0, r = dp.size() - 1;
					while (l < r) {
						int mid = l + (r - l) / 2;
						if (q[i][j] < dp[mid]) l = mid + 1;
						else r = mid;
					}
					q3[i][j] = l + 1;
					dp[l] = q[i][j];
				}
			}
		}
		for (int i = 1; i <= n; i++) {
			vector<int>dp;
			dp.push_back(q[i][m]);
			for (int j = m - 1; j >= 1; j--) {
				if (q[i][j] < dp.back()) {
					dp.push_back(q[i][j]); q3[i][j] = max(q3[i][j], (int)dp.size());
				}
				else {
					int l = 0, r = dp.size() - 1;
					while (l < r) {
						int mid = l + (r - l) / 2;
						if (q[i][j] < dp[mid]) l = mid + 1;
						else r = mid;
					}
					q3[i][j] = max(q3[i][j], l + 1);
					dp[l] = q[i][j];
				}
			}
		}
		for (int i = 1; i <= m; i++) {
			q4[1][i] = 1;
			vector<int>dp;
			dp.push_back(q[1][i]);
			for (int j = 2; j <= n; j++) {
				if (q[j][i] < dp.back()) {
					dp.push_back(q[j][i]); q4[j][i] = dp.size();
				}
				else {
					int l = 0, r = dp.size() - 1;
					while (l < r) {
						int mid = l + (r - l) / 2;
						if (q[j][i] < dp[mid]) l = mid + 1;
						else r = mid;
					}
					q4[j][i] = l + 1;
					dp[l] = q[j][i];
				}
			}
		}
		for (int i = 1; i <= m; i++) {
			vector<int>dp;
			dp.push_back(q[n][i]);
			for (int j = n - 1; j >= 1; j--) {
				if (q[j][i] < dp.back()) {
					dp.push_back(q[j][i]); q4[j][i] = max(q4[j][i], (int)dp.size());
				}
				else {
					int l = 0, r = dp.size() - 1;
					while (l < r) {
						int mid = l + (r - l) / 2;
						if (q[j][i] < dp[mid]) l = mid + 1;
						else r = mid;
					}
					q4[j][i] = max(q4[j][i], l + 1);
					dp[l] = q[j][i];
				}
			}
		}
		int maxx = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				maxx = max({ maxx,q1[i][j] + q4[i][j],q2[i][j] + q3[i][j] });
//第一次上下+第二次左右,第一次左右+第二次上下
			}
		}
		cout << maxx - 1 << '\n';
	}
}

到了这里,关于K-01BFS(2023河南萌新联赛第(五)场:郑州轻工业大学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LitCTF2023 郑州轻工业大学首届网络安全赛 WP 部分

    由于刚接触CTF没多久 还是属于萌新级别的(中专高中生)也没怎么打过比赛记录一下学习的过程大佬绕过即可,后续会继续加油努力。 NSSCTF平台:https://www.nssctf.cn/ PS:记得所有的 flag 都改为 NSSCTF或者LitCTF 我Flag呢? 奇怪,放哪里了,怎么看不见呢?(初级难度) 直接 F12

    2024年02月05日
    浏览(51)
  • 2023河南萌新联赛第(六)场:河南理工大学 C - 旅游

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 小C喜欢旅游,现在他要去DSH旅游,DSH里有nnn个城市和 n − 1 n-1 n − 1 条双向道路(每条道路长度为1),每条道路连接两个城市,并且任意两个城市都可以通过这些的

    2024年02月11日
    浏览(43)
  • 2023河南萌新联赛第(六)场:河南理工大学-C 旅游

    https://ac.nowcoder.com/acm/contest/63602/C 小C喜欢旅游,现在他要去DSH旅游,DSH里有 n n n 个城市和 n − 1 n−1 n − 1 条双向道路(每条道路长度为1),每条道路连接两个城市,并且任意两个城市都可以通过这些的道路互相到达。现在小C要使用魔法指定传送到DSH里的一个城市,作为他

    2024年02月12日
    浏览(40)
  • 2023河南萌新联赛第(四)场:河南大学 F - 小富的idea

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 要注意节约 卷王小富最近又在内卷,并且学了一门新的技能:书法,但是不幸的是在国庆节的书法大赛上,小富不小心打翻了墨水瓶,导致很多墨滴溅在了他的书法纸上,看着墨水不断

    2024年02月13日
    浏览(46)
  • F-小富的idea(2023河南萌新联赛第(四)场:河南大学)

    卷王小富最近又在内卷,并且学了一门新的技能:书法,但是不幸的是在国庆节的书法大赛上,小富不小心打翻了墨水瓶,导致很多墨滴溅在了他的书法纸上,看着墨水不断扩散,浸透了他的书法纸,小富突然萌生了一个想法:我能不能知道某时刻纸上一共有多少墨块?  我

    2024年02月13日
    浏览(34)
  • 2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 给定一棵包含 n n n 个顶点的树 T T T ,以及 m m m 个查询请求。每个查询包含三个参数 : x 、 y :x、y : x 、 y 和 k k k 。其中 x x x 和 y y y 是树中的两个顶点, k k k 是一个整数。对于

    2024年02月15日
    浏览(41)
  • 郑州轻工业大学OJ合集(C语言)

    代码仅供参考,为作者初次学习C语言时所写 以下代码均未添加注释 学习编程语言,最忌眼高手低。 copy后,不要直接粘到编译器里面,要自己手打,你copy的不应该是代码,而是代码思路,copy的思路多了,自己也就会写了,但是copy代码多了,什么也学不会 0.ZZULIOJ:1000: 从今天开

    2024年02月08日
    浏览(51)
  • 郑州轻工业大学(ZZULIOJ) 答案汇总(C)(更新中)

    1000 整数a+b 1001 植树问题 1002 简单多项式求值 1003 两个整数的四则运算 1004 三位数的数位分离 1005 整数幂 1006 求等差数列的和 1007 鸡兔同笼

    2023年04月14日
    浏览(37)
  • 郑州轻工业大学Java实验五多线程编程

    一、实验目的 1. 掌握线程类的定义和使用方法; 2. 能够解决线程调度、线程同步等问题; 3. 能够选择使用合适的线程类和接口设计多线程程序完成相关操作,解决特定问题。 二、课程目标 支撑课程目标(4): 了解Java开发主流平台、工具的特点、使用方法和局限性,能够

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包