P9869 [NOIP2023] 三值逻辑求调
  • 板块学术版
  • 楼主0tAp
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/13 21:33
  • 上次更新2024/10/13 21:41:22
查看原帖
P9869 [NOIP2023] 三值逻辑求调
758858
0tAp楼主2024/10/13 21:33
#include<algorithm>
#include<iostream>
#include<string.h>
#include<cstdio>
#include<vector> 
#include<queue>
#include<cmath>
#include<map>
using namespace std;
#define int long long
#define repu(i,u) for(int i=(h[u]);i;i=(ne[i]))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define xx return
const int N=2e5+10;
const int T=200001,F=200002,U=200003;

int c,t,n,m;
int a[N*2],fa[N*2];

int find(int x)
{
	xx x==fa[x]?x:fa[x]=find(fa[x]);
}

void solve()
{
	scanf("%lld%lld",&n,&m);
	rep(i,0,N)fa[i]=i,a[i]=i;
	int ans=0;
	rep(i,1,m)
	{
		char opt;cin>>opt;
		if(opt=='+')
		{
			int x,y;scanf("%lld%lld",&x,&y);
			a[x]=a[y];
			a[x+n]=a[y+n];
		}
		if(opt=='-')
		{
			int x,y;scanf("%lld%lld",&x,&y);
			if(x==y&&)
			{
				a[x]=U,a[x+n]=U;
			}
			else {
				a[x]=a[y+n];
				a[x+n]=a[y];
			}
		}
		if(opt=='U')
		{
			int x;scanf("%lld",&x);
			a[x]=U,a[x+n]=U;
		}
		if(opt=='T')
		{
			int x;scanf("%lld",&x);
			a[x]=T;
			a[x+n]=F;
		}
		if(opt=='F')
		{
			int x;scanf("%lld",&x);
			a[x]=F;
			a[x+n]=T;
		}
	}
	rep(i,1,2*n)
	{
		fa[find(i)]=find(a[i]);
	}
	
	rep(i,1,n)
	{
		if(find(i)==find(i+n))ans++;
	}
	printf("%lld\n",ans);
	xx;
}

signed main()
{
	scanf("%lld%lld",&c,&t);
	while(t--)solve();
	xx 0;
}

后四个点全WA

2024/10/13 21:33
加载中...