码迷,mamicode.com
首页 > 其他好文 > 详细

可持久化并查集

时间:2016-05-18 09:10:35      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

 void buildntree(int left ,int right){
     int mid=(left+right)/2;
     tr[++cnt].l=left;tr[cnt].r=right;
     if (left!=right){
         int t=cnt;
         tr[t].lc=cnt+1;
         buildntree(left,mid);
         tr[t].rc=cnt+1;
         buildntree(mid+1,right);
     }else {
     tr[cnt].fa=left;
     tr[cnt].size=1;
         }
 }
 
 int getfa(int po,int targ){
     int mid=(tr[po].l+tr[po].r)/2;
     if (tr[po].l==tr[po].r) return(tr[po].fa);
     if (targ<=mid) return(getfa(tr[po].lc,targ)); else return(getfa(tr[po].rc,targ));
 }
 
 int getsize(int po,int targ){
     int mid=(tr[po].l+tr[po].r)/2;
     if (tr[po].l==tr[po].r) return(tr[po].size);
     if (targ<=mid) return(getsize(tr[po].lc,targ)); else return(getsize(tr[po].rc,targ));
 }
 
 void expdfa(int targ,int cha){
     tr[++cnt].l=tr[fol].l;
     tr[cnt].r=tr[fol].r;
     tr[cnt].fa=tr[fol].fa;
     tr[cnt].size=tr[fol].size;
    int mid=(tr[fol].l+tr[fol].r)/2;
    if (tr[fol].l==tr[fol].r){tr[cnt].fa=cha;return;}
     if (targ<=mid){
         tr[cnt].rc=tr[fol].rc;
         fol=tr[fol].lc;
         tr[cnt].lc=cnt+1;
         expdfa(targ,cha);
     }else{
         tr[cnt].lc=tr[fol].lc;
         fol=tr[fol].rc;
         tr[cnt].rc=cnt+1;
         expdfa(targ,cha);
     }
 }
 
 void expdsize(int targ){
     tr[++cnt].l=tr[fol].l;
     tr[cnt].r=tr[fol].r;
     tr[cnt].fa=tr[fol].fa;
     tr[cnt].size=tr[fol].size;
    int mid=(tr[fol].l+tr[fol].r)/2;
    if (tr[fol].l==tr[fol].r){tr[cnt].size++;return;}
     if (targ<=mid){
         tr[cnt].rc=tr[fol].rc;
         fol=tr[fol].lc;
         tr[cnt].lc=cnt+1;
         expdsize(targ);
     }else{
         tr[cnt].lc=tr[fol].lc;
         fol=tr[fol].rc;
         tr[cnt].rc=cnt+1;
         expdsize(targ);
     }
 }

int fax=getfa(dl[top].root,op[i][1]),
                     fay=getfa(dl[top].root,op[i][2]);
                 while (getfa(dl[top].root,fax)!=fax) fax=getfa(dl[top].root,fax);
              while (getfa(dl[top].root,fay)!=fay) fay=getfa(dl[top].root,fay);         
                 if (fax!=fay){
                         dl[top+1].root=cnt+1;
                         dl[top+1].ans=dl[top].ans+i;
                         dl[top+1].sid=dl[top].sid+1;
                         int sizx=getsize(dl[top].root,fax);
                         int sizy=getsize(dl[top].root,fay);
                         fol=dl[top].root;
                         if (sizx<sizy) expdfa(fax,fay);
                    if (sizx>=sizy) expdfa(fay,fax);     
                    if (sizx==sizy){int t=cnt+1;fol=dl[top+1].root;expdsize(fax);dl[top+1].root=t;}
                    top++;}     
                    else{dl[top+1].root=dl[top].root;
                        dl[top+1].ans=dl[top].ans;
                        dl[top+1].sid=dl[top].sid;
                        top++;};

 

可持久化并查集

标签:

原文地址:http://www.cnblogs.com/zhujiangning/p/5503942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!