萌新刚学求助OI
查看原帖
萌新刚学求助OI
173660
zhoukangyang楼主2020/11/22 19:26

线段树分治裸题都调不出来了,很早就写出来了,但是调了一个下午 + 晚上却没能 AC,换了多种方法仍然 WA。

现在是 WA on test 10

代码感觉还算清晰,求调

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j, i##E = k; i <= i##E; i++) 
#define R(i, j, k) for(int i = j, i##E = k; i >= i##E; i--)
#define ll long long
#define ull unsigned long long 
#define db double
#define pii pair<int, int>
#define mkp make_pair
using namespace std;
const int N = 5e5 + 7;
struct UFS {
	stack< pii > stk;
	int fa[N << 1], siz[N << 1]; // George1123 命令蒟蒻用 siz
	int find(int x) { return fa[x] == x ? x : find(fa[x]); }
	void init(int x) {
		L(i, 1, x) fa[i] = i, siz[i] = 1;
	}
	bool Merge(int x, int y) {
		x = find(x), y = find(y);
		if(x == y) return 0;
		if(siz[x] > siz[y]) swap(x, y);
		stk.push(mkp(x, siz[x]));
		siz[y] += siz[x], fa[x] = y;
		return 1;
	} 
	void revoke() {
		int x = stk.top().first;
		fa[x] = x, siz[fa[x]] -= stk.top().second;
	}
} ufs[51];
int n, m, q, k, las[N], U[N], V[N];
struct node {
	int Eid, val, l, r, las; 
} ask[N]; 
vector< int > ve[N << 2];
void add(int id, int L, int R, int val) {
	if(ask[val].l <= L && R <= ask[val].r) return ve[id].push_back(val), void();
	int mid = (L + R) / 2;
	if(ask[val].l <= mid) add(id << 1, L, mid, val);
	if(ask[val].r > mid) add(id << 1 | 1, mid + 1, R, val);
}
int Ans[N];
void dfs(int id, int L, int R) {
	int Cnt[51] = {};
	for(int x : ve[id]) if(ask[x].val) 
		Cnt[ask[x].val] += ufs[ask[x].val].Merge(U[ask[x].Eid], V[ask[x].Eid] + n), 
		Cnt[ask[x].val] += ufs[ask[x].val].Merge(V[ask[x].Eid], U[ask[x].Eid] + n);
	if(L == R) {
		if(ufs[ask[L].val].find(U[ask[L].Eid]) != ufs[ask[L].val].find(V[ask[L].Eid])) printf("YES\n");
		else printf("NO\n"), ask[L].val = ask[ask[L].las].val;
	}
	else {
		int mid = (L + R) / 2;
		dfs(id << 1, L, mid), dfs(id << 1 | 1, mid + 1, R);		
	}
	L(i, 1, k) while(Cnt[i]--) ufs[i].revoke(); 
}
int main() {
	scanf("%d%d%d%d", &n, &m, &k, &q);
	L(i, 1, m) scanf("%d%d", &U[i], &V[i]);
	L(i, 1, q) scanf("%d%d", &ask[i].Eid, &ask[i].val), ask[i].l = i + 1;
	L(i, 1, m) las[i] = q + 1; 
	R(i, q, 1) ask[i].r = las[ask[i].Eid] - 1, ask[las[ask[i].Eid]].las = i, las[ask[i].Eid] = i;
	L(i, 1, q) if(ask[i].l <= ask[i].r) add(1, 1, q, i);
	L(i, 1, k) ufs[i].init(2 * n);
	dfs(1, 1, q);
	return 0;
}
2020/11/22 19:26
加载中...