都改到和第一篇题解几乎一样了还是WA5pts
查看原帖
都改到和第一篇题解几乎一样了还是WA5pts
682196
2022dyx楼主2024/9/18 23:09
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int n, m, idx;
struct Node { int fa, ans, first; vector <int> son; } a[N];
struct Edge { int frm, to; bool avl; } e[N];
struct Query { char op; int x, y; } q[N];
int getfa(int x) { return x == a[x].fa ? x : a[x].fa = getfa(a[x].fa); }
void merge(int x, int y, int z) {
	x = getfa(x), y = getfa(y);
	if (x == y) return;
	if (a[x].ans == 0 && a[y].ans != 0) swap(x, y);
	if (a[x].ans != 0 && a[y].ans == 0) for (int i : a[y].son) a[i].ans = z;
	if (a[x].son.size() < a[y].son.size()) swap(x, y);
	a[y].fa = x;
	for (int i : a[y].son) a[x].son.push_back(i);
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) a[i] = {i, m}, a[i].son.push_back(i);
	for (int i = 1; i <= m; ++i) {
		cin >> q[i].op >> q[i].x;
		if (q[i].op == 'D') a[q[i].x].ans = 0, a[q[i].x].first = a[q[i].x].first == 0 ? i : a[q[i].x].first;
		if (q[i].op == 'A') cin >> q[i].y, e[++idx] = {q[i].x, q[i].y, true};
		if (q[i].op == 'R') e[q[i].x].avl = false;
	}
	for (int i = 1; i <= idx; ++i) if (e[i].avl) merge(e[i].frm, e[i].to, n);
	for (int i = m; i >= 1; --i) {
		if (q[i].op == 'D') if (!a[q[i].x].ans && a[q[i].x].first == i) for (int j : a[getfa(q[i].x)].son) a[j].ans = i - 1;
		if (q[i].op == 'R') merge(e[q[i].x].frm, e[q[i].x].to, i - 1);
	}
	for (int i = 1; i <= n; ++i) cout << a[i].ans << '\n';
} 
2024/9/18 23:09
加载中...