【代码】P6283 [USACO20OPEN] The Moo Particle S [思维]
学校模拟赛,第一版打了个 50 分并查集:
#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;struct node {int x, y;
} a[N];int fa[N];int findfa(int x) {if (fa[x] == x) {return x;}return fa[x] = findfa(fa[x]);
}bool cmp (node n1, node n2) {if (n1.x != n2.x) return n1.x < n2.x;else return n1.y < n2.y;
}int main () {ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n;for (int i = 1; i <= n; i ++) {cin >> a[i].x >> a[i].y;fa[i] = i;}sort(a + 1, a + n + 1, cmp);for (int i = 1; i <= n; i ++) {for (int j = i + 1; j <= n; j ++) {if (a[i].y <= a[j].y) {int tx = findfa(i), ty = findfa(j);if (tx != ty) {fa[tx] = ty;}}}}int sum = 0;for (int i = 1; i <= n; i ++) if (fa[i] == i) {sum ++;}cout << sum << "\n";return 0;
}
考虑将点集按 x 从小到大排序,第二关键字 y 也是从小到大。
设 l[i] 为下标 1 到 i 最小 y 值,r[i] 为下标 n 到 i 的最大 y 值。
如果 l[i] > r[i + 1],代表 [1, i] 的 y 整体大于 [i + 1, n] 的 y,
但 [1, i] 的 x 又整体小于等于 [i + 1, n] 的 x,所以两者不可能在一联通块,ans ++。
然后最开始只有一个连通块,ans = 1。
代码:
#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int l[N], r[N]; struct Part {int x, y;
} a[N];bool cmp(Part pa, Part pb) {if (pa.x != pb.x) {return pa.x < pb.x;}else {return pa.y < pb.y;}
}int main () {ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n;for (int i = 1; i <= n; i ++) {cin >> a[i].x >> a[i].y;}sort(a + 1, a + n + 1, cmp);l[1] = a[1].y;for (int i = 2; i <= n; i++) {l[i] = min(l[i - 1], a[i].y);}r[n] = a[n].y;for (int i = n - 1; i >= 1; i --) {r[i] = max(r[i + 1], a[i].y);}int sum = 1;for (int i = 1; i < n; i ++) {if (l[i] > r[i + 1]) {sum ++;}}cout << sum << "\n";return 0;
}