社区讨论
为什么WA?玄关
P13736 [JOIGST 2025] 日本浮现 / Japan Emerges参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdpmrb
- 此快照首次捕获于
- 2025/11/04 00:53 4 个月前
- 此快照最后确认于
- 2025/11/04 00:53 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define inf (1ll << 62)
#define PII pair<int, int>
#define fi first
#define se second
#define pb push_back
using namespace std;
const int MAXN = 2e5 + 10;
int h, w, n;
struct Node {
int x, y;
};
vector<Node> d(MAXN);
namespace DSU {
vector<int> fa(MAXN);
void Init(int n) {for (int i = 0; i <= n; i++) fa[i] = i;}
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void merge(int a, int b) {int x = find(a), y = find(b);fa[x] = y;}
}
using namespace DSU;
bool check(int x) {
Init(n);
int pos = -1;
for (int i = 0; i < n; i++) {
if (d[i].y == d[0].y + 1) {
pos = i;
break;
}
}
for (int i = 0; i < n - 1; i++) {
if (d[i + 1].y == d[i].y) {
if (d[i + 1].x - d[i].x <= x && find(i + 1) != find(i)) {
merge(i + 1, i);
}
}
if (pos != -1) {
while (pos < n && (d[pos].x < d[i].x || d[pos].y < d[i].y + 1)) pos++;
while (pos < n && d[pos].x <= d[i].x + x && d[pos].y == d[i].y + 1) {
if (find(pos) != find(i)) {
merge(pos, i);
}
pos++;
}
}
}
int num = find(0);
for (int i = 1; i < n; i++) {
if (find(i) != num) {
return false;
}
}
return true;
}
void solve() {
cin >> h >> w >> n;
for (int i = 0; i < n; i++) {
cin >> d[i].x >> d[i].y;
}
sort(d.begin(), d.begin() + n, [&](Node a, Node b) {
if (a.y != b.y) return a.y < b.y;
return a.x < b.x;
});
int l = 0, r = 1e14;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
if (!check(l)) cout << "-1\n";
else cout << l << "\n";
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
while (t--) {
solve();
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...