NOIP T2 求调(悬关)
  • 板块学术版
  • 楼主huta0
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/23 15:17
  • 上次更新2023/11/23 18:21:17
查看原帖
NOIP T2 求调(悬关)
749665
huta0楼主2023/11/23 15:17

rt

#include<iostream>
#include<cstring>
using namespace std;
int p,T;
int n,m,l,r;
int ans;
char ch;
int v,w;

struct dsu {
    int fa[100010];
    void init() {
        for(int i=1; i<=n; i++)
            fa[i]=i;
    }
    int find(int x) {
        if(fa[x]==x) return x;
        return find(fa[x]);
    }
    void merge(int x,int y) {
        fa[find(x)]=find(y);
    }
};

dsu a,b;
char col[100005];
//char cat[100005];

int main()
{
    cin.tie(0);
    cout.tie(0);
    cin>>p>>T;
    while(T--) {
        cin>>n>>m;
        a.init();
        b.init();
        memset(col,'T',sizeof(col));
        ans=0;
        //memset(cat,'T',sizeof(cat));
        for(int i=1; i<=m; i++) {
            cin>>ch;
            if(isupper(ch)) {
                cin>>m;
                col[m]=ch;
            } else {
                cin>>l>>r;
                if(ch=='+') {
                    a.merge(l,r);
                    if(a.find(l)==a.find(r)&&b.find(l)==b.find(r)) {
                        col[l]='U';
                        col[r]='U';
                    } else col[l]=col[r];
                }
                if(ch=='-') {
                    b.merge(l,r);
                    if(a.find(l)==a.find(r)&&b.find(l)==b.find(r)) {
                        if(v%2==1) {
                            a.merge(l,r);
                            col[l]=col[r];
                            b.fa[l]=l,b.fa[r]=r;
                            v++;
                        } else {
                            col[l]='U';
                            col[r]='U';
                        }
                        v++;
                    } else if(col[r]=='T') col[l]='F';
                    else if(col[r]=='F') col[l]='T';
                    else if(col[r]=='U') col[l]='U';
                }
            }
            for(int i=1; i<=n; i++) {
                //cout<<col[i]<<' ';
                if(col[i]=='U') ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
2023/11/23 15:17
加载中...