NOIP T2离奇RE
  • 板块学术版
  • 楼主stueam
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/27 21:51
  • 上次更新2023/11/27 22:01:51
查看原帖
NOIP T2离奇RE
250640
stueam楼主2023/11/27 21:51

这为什么RE啊,而且只有官方数据会RE,之前民间数据都没有这个问题

#include <bits/stdc++.h>
#define debug puts("debug");
using namespace std;

typedef long long ll;
typedef double db;
typedef pair<int,int> pii;

const int N = 4000010;
int n,m;
int ans;
int fa[N],f[N],sz[N];
int tg[N];
int idx[N];
vector <int> e[N];
bool st[N];
int find(int k[],int x) {
	if(x == k[x]) return x;
	k[x] = find(k,k[x]);
	return k[x];
}
void dfs(int rt,int u,int fa) {
	tg[u] = rt;
	st[u] = 1;
	for(auto v : e[u]) {
		if(v == fa)	continue;
		if(!st[v]) dfs(rt,v,u);
	}
}
void solve() {
	scanf("%d%d",&n,&m);
	int num = n * 2 + 3;
	memset(f,0,sizeof f);
	memset(st,0,sizeof st);
	memset(tg,0,sizeof tg);
	for(int i = 1;i <= 4 * n;i++)
		fa[i] = i, sz[i] = 1, e[i].clear();
	for(int i = 1;i <= num;i++)
		idx[i] = i;

	auto modify1 = [&](int x,char c) {
		idx[x] += num;
		idx[x + n] += num;
		int &p = fa[idx[x]],&q = fa[idx[x + n]]; q = p = n * 2;
		if(c == 'T') 
			p++, q += 2;
		if(c == 'F') 
			p += 2, q += 2;
		if(c == 'U') 
			p += 3, q += 3;
		sz[p] += sz[idx[x]]; sz[q] += sz[idx[x + n]];
	};
	auto modify2 = [&](int a,int b,char c) {//b -> a
		if(a == b && c == '+') return;
		if(a == b) {
			idx[a] += num;
			fa[idx[a]] = idx[b + n];
			idx[a + n] += num;
			fa[idx[a + n]] = idx[b];
			sz[idx[b + n]] += sz[idx[a]];
			sz[idx[b]] += sz[idx[a + n]];
			return;
		}
		idx[a] += num;
		idx[a + n] += num;
		if(c == '+') {
			fa[idx[a]] = idx[b];
			fa[idx[a + n]] = idx[b + n];
			sz[idx[b]] += sz[idx[a]];
			sz[idx[b + n]] += sz[idx[a + n]];
		}
		else {
			fa[idx[a]] = idx[b + n];
			fa[idx[a + n]] = idx[b];
			sz[idx[b + n]] += sz[idx[a]];
			sz[idx[b]] += sz[idx[a + n]];
		}		

	};
	for(int i = 1;i <= m;i++) {
		char opt;
		int a,b;
		cin >> opt >> a;
		if(opt == 'T' || opt == 'F' || opt == 'U') {
			//now number idx[a]
			modify1(a,opt);
		} else {
			scanf("%d",&b);
			modify2(a,b,opt);//b -> a
		}
	}
	ans = 0;
	for(int i = 1;i <= n * 2;i++)
		f[i] = i;
	for(int i = 1;i <= n;i++) {
		int p = find(fa,idx[i]);
		if(p == i + n || p == num) {
			e[num].push_back(i);
			e[num].push_back(i + n);
			e[i].push_back(num);
			e[i + n].push_back(num);
			continue;
		}
		e[p].push_back(i);
		e[i].push_back(p);
		if(p == 2 * n + 1) {
			e[i + n].push_back(p + 1);
			e[p + 1].push_back(i + n);
		}
		if(p == 2 * n + 2) {
			e[i + n].push_back(p - 1);
			e[p - 1].push_back(i + n);	
		}
		if(p > n && p <= 2 * n) {
			e[i + n].push_back(p - n);
			e[p - n].push_back(i + n);
		}
		if(p <= n) {
			e[i + n].push_back(p + n);
			e[p + n].push_back(i + n);
		}

		//i & f[i]
	}
	for(int i = 1;i <= num;i++) {
		if(!st[i]) {
			dfs(i,i,-1);
		}
	}
	for(int i = 1;i <= n;i++)
		if(tg[i] == tg[i + n]) ans++;
	printf("%d\n",ans);

}

int main() {
	//freopen("tribool.in","r",stdin);
	//freopen("tribool.out","w",stdout);
	int c,t;
	scanf("%d%d",&c,&t);
	while(t--) {
		solve();
	}
	return 0;
}
2023/11/27 21:51
加载中...