社区讨论
妹子刚学OI1ms,p9869 80pts玄关求条
P9869[NOIP2023] 三值逻辑参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mhjh0fnz
- 此快照首次捕获于
- 2025/11/04 02:25 4 个月前
- 此快照最后确认于
- 2025/11/04 02:25 4 个月前
帮Lovelace_qwq发的
CPP#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<climits>
#include<vector>
#define ll long long
#define endl '\n'
using namespace std;
const int U=2e5+9,T=2e5+8,F=2e5+7;
int c,t,n,m,x,y;
int val[200010],fa[200010],ans;
char op[2];
int find(int x){
if(fa[x]==x)return fa[x];
else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
fa[fx]=fy;
}
}
main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>c>>t;
while(t--){
cin>>n>>m;
ans=0;
for(int i=1;i<=n;i++){
val[i]=i;
}
while(m--){
cin>>op>>x;
if(op[0]=='+'||op[0]=='-'){
cin>>y;
if(op[0]=='+'){
val[x]=val[y];
}else{
val[x]=-val[y];
}
}else{
if(op[0]=='U'){
val[x]=U;
}else if(op[0]=='T'){
val[x]=T;
}else{
val[x]=F;
}
}
}
for(int i=1;i<=n*2;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
if(abs(val[i]==U)){
merge(i,i+n);
}else if(abs(val[i])==T||abs(val[i])==F){
continue;
}else if(val[i]>0){
merge(val[i],i);
merge(val[i]+n,i+n);
}else if(val[i]<0){
merge(-val[i],i+n);
merge(-val[i]+n,i);
}
}
for(int i=1;i<=n;i++){
if(find(i)==find(n+i)){
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...