zoukankan      html  css  js  c++  java
  • 并查集的区间跳跃

    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 }
    我太难了~给个三连吧,亲~~~
  • 相关阅读:
    alpha冲刺—Day8
    alpha冲刺—Day7
    alpha冲刺—冲刺计划&代码规范
    Linux安装jdk
    chrome插件开发-notification API注意事项
    VSCode远程连接Docker
    Idea发布项目到Docker
    开发环境配置
    Java设计模式之《单例模式》及应用场景
    使用Docker安装jenkins
  • 原文地址:https://www.cnblogs.com/LMCC1108/p/9355305.html
Copyright © 2011-2022 走看看