为什么我用结构体会超时?

P3367 【模板】并查集

pacel_dicke @ 2017-10-18 00:51:59

两份代码,用数组的AC,结构体的70,我也没改什么啊,就是把结构体改成数组而已。。。

int n,m,f[10005];
int findroot(int x){
    if(f[x]==x) return x;
    f[x]=findroot(f[x]);
    return f[x];
}
void rewrite(int x,int y){
    int r1=findroot(x),r2=findroot(y);
    if(r1!=r2) f[r1]=f[r2];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=0,cmd,x,y;i<m;i++){
        scanf("%d %d %d",&cmd,&x,&y);
        if(cmd==1){
            rewrite(x,y);
        }else{
            if(findroot(x)==findroot(y)) printf("Y\n");
            else printf("N\n");
        }
    }
    return 0;
}
struct node{
    int val,f=-1;
}line[10002];
int findroot(node x){
    if(x.f==-1) return x.val;
    x.f=findroot(line[x.f]);
    return x.f;
}
void rewrite(node x,node y){
    int root1=findroot(x),root2=findroot(y);
    if(root1!=root2) x.f=line[root1].f=root2;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) line[i].val=i;
    for(int i=0,cmd,x,y;i<m;i++){
        cin>>cmd>>x>>y;
        if(cmd==1){
            rewrite(line[x],line[y]);
        }else{
            if(findroot(line[x])==findroot(line[y])) cout<<"Y"<<endl;
            else cout<<"N"<<endl;
        }
    }
    return 0;
}

by hjfzzm @ 2017-10-18 07:58:58

结构体是自定义的数据类型,来回调用比内建的数组确实是慢一些。


by 逆尘 @ 2017-10-21 14:57:04

因为struct慢,换class就可以了


|