AT WA*6 求助
查看原帖
AT WA*6 求助
645010
A1C3楼主2024/8/14 21:14
#include <iostream>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
const int N = 2e5 + 7;
struct Node {
	int first, second, pos;
	bool operator< (const Node &B) const {
		return first < B.first;
	}
} a[N];
pii mn[N], mx[N];
int fa[N], sz[N], ans[N];
int find(int k) { return fa[k]==k ? k : fa[k]=find(fa[k]); }
void merge(int u, int v) {
	int x = find(u), y = find(v);
	if (x == y) return;
	if (sz[x] > sz[y]) fa[y] = x, sz[x] += sz[y];
	else fa[x] = y, sz[y] += sz[x];
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d%d", &a[i].first, &a[i].second);
		a[i].pos = i, fa[i] = i, sz[i] = 1;
	}
	sort(a+1, a+n+1);
	mn[0] = {2e9, 0}, mx[n+1] = {-2e9, n+1};
	for (int i = 1; i <= n; ++i) {
		mn[i] = mn[i-1];
		if (a[i].second < mn[i].first)
			mn[i] = {a[i].second, i};
	}
	for (int i = n; i; --i) {
		mx[i] = mx[i+1];
		if (a[i].second > mx[i].first)
			mx[i] = {a[i].second, i};
	}
	for (int i = 1; i <= n; ++i) {
		if (mn[i].first < a[i].second) merge(i, mn[i].second);
		if (mx[i].first > a[i].second) merge(i, mx[i].second);
	}
	for (int i = 1; i <= n; ++i)
		ans[a[i].pos] = sz[find(i)];
	for (int i = 1; i <= n; ++i)
		printf("%d\n", ans[i]);
	return 0;
}
/*
mn    mx
1 6  {6,1} {7,2}
2 7  {6,1} {7,2}
3 5  {5,3} {5,3}
4 3  {3,4} {4,6}
5 2  {2,5} {4,6}
6 4  {2,5} {4,6}
7 1  {1,7} {1,7}

*/
2024/8/14 21:14
加载中...