问个问题
查看原帖
问个问题
338786
mushroom_knight楼主2021/1/16 13:45

RT,既然

注:实际上 n106n\le 10^6

那这一份代码为什么会只有50啊。

(就是对每一个读进来的i,ji,j 都膜一下 106+110^6+1


#include<bits/stdc++.h>
using namespace std;

const int si=1e6+10;
const int mod=1e6+1;
int T;
int n;

int pa[si];
int size_[si];
struct node{
    int x,y;
    int e;
    bool operator < (const node &x)const{
        return e>x.e;
    }
}a[si];

int root(int x){
    if(pa[x]!=x){
        return pa[x]=root(pa[x]);
    }
    return pa[x];
}

void Union(int x,int y){
    int rx=root(x);
    int ry=root(y);
    if(rx==ry){
        return;
    }
    if(size_[rx]>size_[ry]){
        pa[ry]=rx;
        size_[rx]+=size_[ry];
    }
    else{
        pa[rx]=ry;
        size_[ry]+=size_[rx];
    }
}

void modread(int &x,int p){
    int u;
    scanf("%d",&u);
    x=u%p;
}

bool prf=true;
void print(int x){
    if(x){
        return (void)(puts("YES"));
    }
    return (void)(puts("NO"));
}

int main(){
    scanf("%d",&T);
    while(T--){
        memset(pa,0,sizeof(pa));
        memset(size_,0,sizeof(size_));
        prf=true;
        scanf("%d",&n);
        for(register int i=1;i<=n;++i){
            modread(a[i].x,mod);
            modread(a[i].y,mod);
            scanf("%d",&a[i].e);
        }
        sort(a+1,a+1+n);
        for(register int i=1;i<=n;++i){
            pa[i]=size_[i]=i;
        }
        for(register int i=1;i<=n;++i){
            if(a[i].e==1){
                Union(a[i].x,a[i].y);
            }
            else{
                if(root(a[i].x)==root(a[i].y)){
                    prf=false;
                    break;
                }
            }
        }
        print(prf);
    }
    return 0;
}
2021/1/16 13:45
加载中...