CF741C

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using i128=__int128;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using db = double;
using ldb = long double;
#define F first
#define S second
const int N=2e5+10;
pii s[N][2];
void init(int n){
    for(int i=0;i<=n;i++){
        for(int j=0;j<2;j++){
            s[i][j]={i,j};
        }
    }
}
pii find(int x,int y){
    if(s[x][y]==(pii){x,y}) return {x,y};
    return s[x][y]=find(s[x][y].F,s[x][y].S);
}
void merge(int x,int y){
    pii rtx=find(x,0),rty=find(y,1);
    s[rty.F][rty.S]=rtx;
    rtx=find(x,1),rty=find(y,0);
    s[rty.F][rty.S]=rtx;
}
void solve(){
    int n;cin>>n;
    init(n*2);
    for(int i=1;i<=n*2;i+=2){
        merge(i,i+1);
    }
    vector<pii> a(n+1);
    for(int i=1;i<=n;i++){
        int x,y;cin>>x>>y;
        a[i]={x,y};
        merge(x,y);
    }
    for(int i=1;i<=n;i++){
        auto [x,y]=a[i];
        if(find(x,0).S==0) cout<<2<<" ";
        else cout<<"1 ";
        if(find(y,0).S==0) cout<<"2\n";
        else cout<<"1\n";
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    // cin>>t;
    while(t--) solve();
    return 0;
}

P_2024_NOI_2001_食物链

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using i128=__int128;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using db = double;
using ldb = long double;
#define F first
#define S second
const int N=1e5+10;
pii s[N][3];
void init(int n){
    for(int i=0;i<=n;i++){
        for(int j=0;j<3;j++){
            s[i][j]={i,j};
        }  
    }
}
pii find(int x,int y){
    if(s[x][y]==(pii){x,y}) return {x,y};
    return s[x][y]=find(s[x][y].F,s[x][y].S);
}
bool merge(int x,int y,int op){
    if(op==1){
        pii rtx=find(x,0),rty=find(y,0);
        if(rtx.F==rty.F&&rtx.S!=rty.S) return false;
        s[rty.F][rty.S]={rtx.F,rtx.S};
        rtx=find(x,1),rty=find(y,1);
        s[rty.F][rty.S]={rtx.F,rtx.S};
        rtx=find(x,2),rty=find(y,2);
        s[rty.F][rty.S]={rtx.F,rtx.S};
    }else{
        pii rtx=find(x,0),rty=find(y,1);
        if(rtx.F==rty.F&&rtx.S!=rty.S) return false;
        s[rty.F][rty.S]={rtx.F,rtx.S};
        rtx=find(x,1),rty=find(y,2);
        s[rty.F][rty.S]={rtx.F,rtx.S};
        rtx=find(x,2),rty=find(y,0);
        s[rty.F][rty.S]={rtx.F,rtx.S};
    }
    return true;
}
void solve(){
    int n,k;cin>>n>>k;
    int ans=0;
    while(k--){
        int op,x,y;cin>>op>>x>>y;
        if(x>n||y>n){
            ans++;
            continue;
        }
        if(op==2&&x==y){
            ans++;
            continue;
        }
        bool mark=merge(x,y,op);
        if(!mark) ans++;
    }
    cout<<ans<<"\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    // cin>>t;
    init(1e5);
    while(t--) solve();
    return 0;
}