蒟蒻求助,30分qwq
查看原帖
蒟蒻求助,30分qwq
480778
Charles_Fan楼主2021/12/12 16:38

#1 #3 #9 AC 其余WA

#include<iostream>
#include<cstdio>
using namespace std;
int father[50001],dist[50001];
int n,k,ans=0,z,x,y;
void init(){
    for(int i=0;i<=50000;i++){
        father[i]=i;
        dist[i]=0;
    }
    return;
}
int find(int x){
    if(father[x]==x){
        return x;
    }
    int old=father[x];
    father[x]=find(father[x]);
    dist[x]=(dist[x]+dist[old]);
    return father[x];
}
void merge(int x,int y,int w){
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy){
        dist[fx]=(dist[y]+w-dist[x]+3)%3;
        father[fx]=fy;
    }
    return;
}
int main(){
    // freopen("input.in","r",stdin);
    // freopen("output.out","w",stdout);
    init();
    cin>>n>>k;
    for(int i=1;i<=k;i++){
        cin>>z>>x>>y;
        if(x>n||y>n){
            ans++;
            // cout<<"LOCATE1"<<endl;
            continue;
        }
        if(z==2&&x==y){
            ans++;
            // cout<<"LOCATE2"<<endl;
            continue;
        }
        if(z==1){
            if(find(x)==find(y)&&dist[x]!=dist[y]){
                ans++;
                // cout<<"LOCATE3"<<endl;
                continue;
            }else if(find(x)!=find(y)){
                merge(x,y,0);
            }
        }else{
            if(x==y){
                ans++;
                continue;
            }
            if(find(x)==find(y)){
                int rel=(dist[x]-dist[y]+3)%3;
                if(rel!=1){
                    ans++;
                    // cout<<"LOCATE4"<<endl;
                    continue;
                }
            }else{
                merge(x,y,1);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
2021/12/12 16:38
加载中...