可持久化并查集
3673:可持久化并查集 by zky

3674: 可持久化并查集加强版

const

  maxn1=10000100;

  maxn2=500000;

var

  lson,rson,fa,deep:array[0..maxn1]of longint;

  root:array[0..maxn2]of longint;

  tot,n,m:longint;



procedure swap(var x,y:longint);

var

  i:longint;

begin

  i:=x;

  x:=y;

  y:=i;

end; 



procedure build(var x:longint;ll,rr:longint);

var

  mid:longint;

begin

  inc(tot);

  x:=tot;

  if ll=rr then begin

    fa[x]:=ll;

    exit;

  end;

  mid:=(ll+rr)>>1;

  build(lson[x],ll,mid);

  build(rson[x],mid+1,rr);

end;



procedure change(x,y,ll,rr,old:longint;var new:longint);

var

  mid:longint;

begin

  inc(tot);

  new:=tot;

  if ll=rr then begin

    fa[new]:=y;

    exit;

  end;

  mid:=(ll+rr)>>1;

  if x<=mid then begin

    rson[new]:=rson[old];

    change(x,y,ll,mid,lson[old],lson[new]);

  end

  else begin

    lson[new]:=lson[old];

    change(x,y,mid+1,rr,rson[old],rson[new]);

  end;

end;



function query(x,y,ll,rr:longint):longint;

var

  mid:longint;

begin

  if ll=rr then exit(x);

  mid:=(ll+rr)>>1;

  if y<=mid then exit(query(lson[x],y,ll,mid))

    else exit(query(rson[x],y,mid+1,rr))

end;



procedure add(x,y,ll,rr:longint);

var

  mid:longint;

begin

  if ll=rr then begin

    inc(deep[x]);

    exit;

  end;

  mid:=(ll+rr)>>1;

  if y<=mid then add(lson[x],y,ll,mid)

    else add(rson[x],y,mid+1,rr);

end;



function getfa(x,y:longint):longint;

var

  ans:longint;

begin

  ans:=query(x,y,1,n);

  if y=fa[ans] then exit(ans)

    else exit(getfa(x,fa[ans]))

end;



procedure into;

begin

  tot:=0;

  readln(n,m);

  build(root[0],1,n);

end;



procedure work;

var

  i,j,x,y,last:longint;

begin

  last:=0;

  for i:=1 to m do begin

    read(j);

    root[i]:=root[i-1];

    case j of

      1:begin

          readln(x,y);

          x:=x xor last;

          y:=y xor last;

          x:=getfa(root[i],x);

          y:=getfa(root[i],y);

          if fa[x]<>fa[y] then begin

            if deep[x]>deep[y] then swap(x,y);

            change(fa[x],fa[y],1,n,root[i],root[i]);

            if deep[x]=deep[y] then add(root[i],fa[y],1,n);

          end;

      end;

      2:begin

          readln(x);

          x:=x xor last;

          root[i]:=root[x];

      end;

      3:begin

          readln(x,y);

          x:=x xor last;

          y:=y xor last;

          x:=getfa(root[i],x);

          y:=getfa(root[i],y);

          if fa[x]<>fa[y] then last:=0

            else last:=1;

          writeln(last);

      end;

    end;

  end;

end;



begin

  into;

  work;

end.
View Code

相关文章:

  • 2022-12-23
  • 2021-10-07
  • 2022-03-05
  • 2022-12-23
  • 2022-02-21
  • 2022-12-23
  • 2021-08-22
猜你喜欢
  • 2021-07-14
  • 2022-02-01
  • 2021-04-16
  • 2022-12-23
  • 2021-12-05
  • 2021-12-16
相关资源
相似解决方案