bzoj3673可持久化线段树实现可持久化数组实现可持久化并查集(好长)

Posted 汪立超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3673可持久化线段树实现可持久化数组实现可持久化并查集(好长)相关的知识,希望对你有一定的参考价值。

线段树只用叶子节点感觉莫名浪费,,,

感觉真好写(刚从未来程序逃回来的人)

 1 #include <cstdio>
 2 #define mid ((l+r)>>1)
 3 int n,m,time,N=0,ca,x,y;
 4 int root[500000],ls[4000000],rs[4000000],a[4000000];
 5 int change(int x,int y)
 6 {
 7     int l=1,r=n,now=++N,past=root[time];
 8     root[++time]=N;
 9     while(l!=r)
10         if(x<=mid)    rs[now]=rs[past],ls[now]=++N,r=mid,now=ls[now],past=ls[past];
11         else    ls[now]=ls[past],rs[now]=++N,l=mid+1,now=rs[now],past=rs[past];
12     a[now]=y;
13 }
14 int que(int x)
15 {
16     int l=1,r=n,now=root[time];
17     while(l!=r)
18         if(x<=mid)    r=mid,now=ls[now];
19         else    l=mid+1,now=rs[now];
20     return a[now];
21 }
22 int get(int p)
23 {
24     for(int t=que(p);t!=p;t=que(p))    p=t;
25     return p;
26 }
27 int main()
28 {
29     scanf("%d%d",&n,&m);
30     root[time=0]=1;
31     for(int i=1;i<=n;i++)
32         change(i,i);
33     int start=time;
34     for(int i=1;i<=m;i++)
35     {
36         scanf("%d%d",&ca,&x);
37         if(ca==2) root[++time]=root[x+start];
38         else
39             scanf("%d",&y),(ca==1)?change(get(y),get(x)):(root[time+1]=root[time++],printf("%d\n",get(x)==get(y)));
40     }
41     return 0;
42 } 

 

以上是关于bzoj3673可持久化线段树实现可持久化数组实现可持久化并查集(好长)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ-3673&3674可持久化并查集 可持久化线段树 + 并查集

[bzoj] 3673 3674 可持久化并查集 || 可持久化数组

[BZOJ 3673]可持久化并查集 by zky

[bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

[BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

[BZOJ 3551] Peaks 半可持久化并查集 可持久化线段树合并