社区讨论

#4,6,8,10WA(数据规模较大案例)本地#4输出为空

P9869[NOIP2023] 三值逻辑参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m2dge7hk
此快照首次捕获于
2024/10/17 23:26
去年
此快照最后确认于
2025/11/04 16:57
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int x[N],fa[N];
const int U=N-2;
const int T=N-1;
const int F=-T;
char opt;
long long a,b;
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
	}
void uni(int x,int y){
	fa[find(x)]=find(y);
} 
int c,t,n,m;
int main(){
	freopen("P9869_4.in","r",stdin);
	freopen("P9869_4.out","w",stdout);
	cin>>c>>t;
	for(int k=t;k>=1;k--){
		cin>>n>>m;
		for(int i=1;i<=n;i++) x[i]=i;
		while(m--){
			cin>>opt;
			if(opt=='+') {
				cin>>a>>b;
				x[a]=x[b];
			}
			else if(opt=='-'){
				cin>>a>>b;
				x[a]=-x[b];
			}
			else {
				cin>>a;
			if(opt=='U') x[a]=U;
			else if(opt=='F') x[a]=F;
			else if(opt=='T') x[a]=T;
			}
		cout<<t<<endl;
		}
	for(int i=1;i<=2*n;i++) fa[i]=i;
	for(int i=1;i<=n;i++){
		if(abs(x[i])==U) uni(i,i+n);
		else if(x[i]==T||x[i]==F) ;
		else if(x[i]>0){
			uni(x[i],i);
			uni(x[i]+n,i+n);
		}
		else if(x[i]<0){
			uni(-x[i],i+n);
			uni(-x[i]+n,i);
		}
	}
	int ans=0;
	for(int i=1;i<=n;++i)
		if(find(i)==find(i+n))
			ans++; 
	cout<<ans<<endl; 
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...