
2023 广东省赛 路径规划 二分
题解
·
题意:每次只能向右或者向下,问路径上格子数的集合中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;
}
更多推荐
所有评论(0)
您需要登录才能发言
加载更多