RT,赛时一直不过第四个大样例
#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define inf 0x3f3f3f3f
#define endl '\n'
using namespace std;
const int N = 2e5+10;
int n,m;
int fa[N],val[N],siz[N],ans;
bool vis[N],use[N];
int t,f,u;
inline int Find(int x){
if(x == fa[x])return x;
return fa[x] = Find(fa[x]);
}
inline void add(int x,int y){
int a = Find(x),b = Find(y);
if(a == b)return ;
fa[b] = a,siz[a] += siz[b];
}
inline void work(){
cin >> n >> m;t = 2*n+1,f = 2*n+2,u = 2*n+3,ans = 0;
for(int i = 1;i <= (n<<1)+3;i ++)val[i] = i,fa[i] = i,vis[i] = 0;
for(int i = 1;i <= n;i ++)siz[i] = 1;
for(int i = n+1;i <= 2*n+3;i ++)siz[i] = 0;
for(int i = 1;i <= m;i ++){
char op;cin >> op;
if(op == '+'){
int x,y;cin >> x >> y;
val[x] = val[y],val[x+n] = val[y+n];
}else if(op == '-'){
int x,y;cin >> x >> y;
val[x] = val[y+n],val[x+n] = val[y];
}else {
int x;cin >> x;
if(op == 'T')val[x] = t,val[x+n] = f;
if(op == 'F')val[x] = f,val[x+n] = t;
if(op == 'U')val[x] = u,val[x+n] = u;
}
}
for(int i = 1;i <= n;i ++){
if(val[i] > (n<<1))continue;
add(i,val[i]);
if(val[i] > n)add(i+n,val[i]-n);
else add(i+n,val[i]+n);
}
for(int i = 1;i <= n;i ++){
int p = Find(i),q = Find(i+n);
if(vis[p])continue;
if(p == q){
ans += siz[p];
vis[p] = 1;
}else{
if(val[i] == u){
ans += siz[p];
vis[p] = 1;
}
if(val[i+n] == u){
ans += siz[q];
vis[q] = 1;
}
}
}
cout << ans << endl;
}
int main(){
file("tribool");
IOS;int c,T;cin >> c >> T;
while(T --)work();
return 0;
}
顺便吐槽一下,这个代码在云斗 60,在洛谷 90