社区讨论
求助
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 条回复,欢迎继续交流。
正在加载回复...