#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
namespace awa {
const int N=1e5+114;
const int T=N,U=0,F=-N;
int c,t;
int n,m,ans;
int fa[N+10];
bool book[2*N+10];
int fnd(int x) {
int re=0;
if(x==T||x==F) return x;
if(book[n-x]||x==U) return U;
if(book[x+n]) return T;
if(x>0) {
if(x==fa[x]) return x;
book[n+x]=1;
re=fnd(fa[x]);
book[n+x]=0;
}
if(x<0) {
if(x==-fa[-x]) return x;
book[n+x]=1;
re=fnd(-fa[-x]);
book[n+x]=0;
}
return re;
}
void solve() {
cin>>c>>t;
while(t--) {
ans=0;
cin>>n>>m;
for(int i=1; i<=n; i++)
fa[i]=i;
for(int i=1; i<=m; i++) {
char op;
int x;
cin>>op>>x;
if(op=='T')
fa[x]=T;
if(op=='U')
fa[x]=U;
if(op=='F')
fa[x]=F;
if(op=='+') {
int y;
cin>>y;
fa[x]=y;
}
if(op=='-') {
int y;
cin>>y;
fa[x]=-y;
}
}
for(int i=1; i<=n; i++) {
if(fnd(i)==U) ans++;
}
cout<<ans<<endl;
}
}
}
int main() {
awa::solve();
return 0;
}
上面这个得分40
还有一个得分0的record
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
namespace awa {
const int N=1e5+114;
const int T=N,U=0,F=-N;
int c,t;
// set s1,s2;
int n,m,ans;
int fa[N];
bool book[2*N];
int fnd(int x) {
int re=0;
if(book[x+n]) return T;
if(book[n-x]||x==U) return U;
if(x==T||x==F) return x;
if(x>0) {
if(x==fa[x]) return x;
book[n+x]=1;
fa[x]=re=fnd(fa[x]);
book[n+x]=0;
}
if(x<0) {
if(x==-fa[-x]) return x;
book[n+x]=1;
fa[-x]=re=fnd(-fa[-x]);
book[n+x]=0;
}
return re;
}
void init() {
ans=0;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
fa[i]=i;
}
void solve() {
cin>>c>>t;
while(t--) {
init();
for(int i=1; i<=m; i++) {
char op;
int x;
cin>>op>>x;
if(op=='T')
fa[x]=T;
if(op=='U')
fa[x]=U;
if(op=='F')
fa[x]=F;
if(op=='+') {
int y;
cin>>y;
fa[x]=y;
}
if(op=='-') {
int y;
cin>>y;
fa[x]=-y;
}
}
for(int i=1; i<=n; i++) {
if(fnd(i)==U) ans++;
}
cout<<ans<<endl;
}
}
}
int main() {
awa::solve();
return 0;
}
跟第一篇题解到底差在哪里了QAQ。 还有为什么第一个就高点,问题出在哪里求解