并查集的区间跳跃

2018/07/23 16:23
阅读数 0

D - Restructuring Company CodeForces - 566D

题目大意:就是公司一开始每个人自己都是一个团队,然后主管有三个操作,一个是把两个团队合并在一起,一个是把x到y的团队都并起来,最后一个就是询问某两个人是否在一个团队,是yes,否no

其实就是个简单的归并,关键就在于第二个操作,如果简单的循环让他们合并的话,很明显会超时,这时候就需要跳过合并过的区间。比如我们已经合并过[3,8]这个区间了,当再要合并[1,10]这个区间时,合并操作到3,因为[3,8]都是同一根节点,所以只需要3进行合并之后就可以跳到9那了。具体操作就是用个next记录它的下一个该位置

 1 #include<stdio.h>
 2 int N[201108],next[201108];
 3 int gui(int x);
 4 void bing(int x,int y);
 5 int main()
 6 {
 7     int i,n,q; 
 8     scanf("%d%d",&n,&q);
 9     for(i=1;i<=n;i++)
10     {
11         N[i]=i;
12         next[i]=i+1;//一开始下一个该合并的位置是它的下一个 
13     }
14     int t,x,y;
15     while(q--)
16     {
17         scanf("%d%d%d",&t,&x,&y);
18         if(t==1)
19             bing(x,y);
20         else if(t==2)
21         {
22             int j;
23             for(i=x+1;i<=y;i=j)
24             {
25                 bing(i-1,i);
26                 j=next[i];
27                 next[i]=next[y];//更新区间中的数的下一个该合并的位置 
28             }
29         }
30         else if(gui(x)==gui(y))
31             printf("YES\n");
32         else
33             printf("NO\n");
34     }
35     return 0;
36 }
37 int gui(int x)
38 {
39     if(N[x]==x)
40         return x;
41     return N[x]=gui(N[x]);
42 }
43 void bing(int x,int y)
44 {
45     int bx=gui(x);
46     int by=gui(y);
47     if(bx!=by)
48         N[by]=bx;
49     return ;
50 }

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部