看上去好像假了
  • 板块学术版
  • 楼主REMAC
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/18 18:06
  • 上次更新2023/11/18 19:22:38
查看原帖
看上去好像假了
386892
REMAC楼主2023/11/18 18:06

rt,T2 40pts

#include<bits/stdc++.h>
using namespace std;

const int maxn=5e5+100;

const int T=3e5+11, F=3e5+12, U=3e5+13;

int fa[maxn],w[maxn],lst[maxn],psz;

int Find(int u) {
	if(fa[u]) {
		int f=fa[u];
		fa[u]=Find(fa[u]);
		w[u]=w[u]*w[f];
		return fa[u];
	}else return u;
}

void Merge(int u,int v,int c) { // u:=v , u->v
	int fu=Find(u),fv=Find(v);
	if(fu==fv) {
		if(w[u]*w[v]!=c&&!(w[u]==0&&w[v]==0)) {
	//		if(fu>1e5+10) cout<<'!';
			w[fu]=0;
//			cout<<'!';
		}
		return;
	}
	fa[fu]=fv;
	w[fu]=w[u]*w[v]*c;
	return;
//	Find(fv);
}

inline int acc(int u) {
	return lst[u]=++psz;
}

void init(int n) {
	memset(fa,0,sizeof fa); //???
	fill(w,w+15+n*3,1);
	for(int i=1;i<=n;i++) lst[i]=i;
}

void work() {
	int n,m;
	cin>>n>>m;
	init(n);
	psz=n;
	while(m--) {
		char op;
		int u,v;
		cin>>op;
		if(op=='T') {
			cin>>u;
			Merge(acc(u),T,1);
		}
		else if(op=='U') {
			cin>>u;
			Merge(acc(u),U,1);
		}
		else if(op=='F') {
			cin>>u;
			Merge(acc(u),F,1);
		}
		else if(op=='+') {
			cin>>u>>v;
			Merge(acc(u),lst[v],1);
		}
		else if(op=='-') {
			cin>>u>>v;
			Merge(acc(u),lst[v],-1);
		}
		else assert(false);
	}
	for(int i=1;i<=n;i++) { //n¸öÔ¼Êø£ºw[lst[i]]==w[i] 
//		if(w[lst[i]]==w[i]) continue;
//		if(Find(i)==Find(lst[i])) {
//			w[Find(i)]=0;
//		}
		Merge(i,lst[i],1);
	}
	int cnt=0;
	for(int i=1;i<=n;i++) {
		Find(i);
	}
	for(int i=1;i<=n;i++) if(w[i]==0) cnt++;
	cout<<cnt<<'\n';
}

int main() {
	//freopen("tribool.in","r",stdin);
//	freopen("tribool.out","w",stdout);
	int c,Tc;
	cin>>c>>Tc;
	w[U]=0,w[F]=-1,w[T]=1;
	while(Tc--) {
		work();
	}
}
2023/11/18 18:06
加载中...