题意:每次只能向右或者向下,问路径上格子数的集合中mex最大是多少。

思路:因为是mex,所以是可以二分的。那么我们考虑怎么check,我们将行作为第一维,进行排序,然后看列是否出现逆序即可。

/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
pii p[1000005];
bool check(int x) {
	vector<pii> kl;
	for (int i = 0; i < x; i++) {
		kl.push_back({p[i]});
	}
	sort(kl.begin(), kl.end());
	int p = 0;
	for (int i = 0; i < x; i++) {
		if (kl[i].second < p) {
			return false;
		}
		p = kl[i].second;
	}
	return true;
}
signed main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		int n, m;
		cin >> n >> m;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				int x;
				cin >> x;
				p[x] = {i + 1, j + 1};
			}
		}
		int l = 0;
		int r = n * m;
		int ans;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (check(mid)) {
				ans = mid;
				l = mid + 1;
			} else {
				r = mid - 1;
			}
		}
		cout << ans << endl;
	}
	return 0;
}

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐