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 "); 32 else 33 printf("NO "); 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 }