社区讨论

求助

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi70fjoa
此快照首次捕获于
2025/11/20 13:48
4 个月前
此快照最后确认于
2025/11/20 23:59
4 个月前
查看原帖
感觉这样做是正确的,但是只有40 pts,请问思路哪里有问题
CPP
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=4e5+30,T=2e5+6,F=2e5+7,U=2e5+8;
int uid,t,n,m,f[maxn];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void merge(int x,int y){
	int a=find(x),b=find(y);
	f[a]=b;
	return;
}
pair<char,int> to[maxn];
int main(){
	IOS
	cin>>uid>>t;
	while(t--){
		cin>>n>>m;
		for(int i=1;i<=2e5+10;i++)f[i]=i;
		for(int i=1;i<=n;i++)to[i]={'.',0};
		char op;
		int x,y;
		for(int i=1;i<=m;i++){
			cin>>op>>x;
			if(op=='T')to[x]={'T',0};
			if(op=='F')to[x]={'F',0};
			if(op=='U')to[x]={'U',0};
			if(op=='+'){
				cin>>y;
				to[x]={'+',y};
			}
			if(op=='-'){
				cin>>y;
				to[x]={'-',y};
			}
		}
		merge(T,F);
		for(int i=1;i<=n;i++){
			if(to[i].first!='.'){
				if(to[i].first=='T')merge(i,T),merge(i+n,F);
				if(to[i].first=='F')merge(i,F),merge(i+n,T);
				if(to[i].first=='U')merge(i,U),merge(i+n,U);
				if(to[i].first=='+')merge(i,to[i].second),merge(i+n,to[i].second+n);
				if(to[i].first=='-')merge(i,to[i].second+n),merge(i+n,to[i].second);
			}
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			if(find(i)==find(i+n))ans++;
			else if(find(i)==find(U))ans++;
		}
		cout<<ans<<"\n";
	} 
} 

回复

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

正在加载回复...