zoukankan      html  css  js  c++  java
  • Asya And Kittens CodeForces

    用并查集维护哪些猫连通;

    每个连通块需要记录左端点,右端点;

    对于每各点来说还要维护他的下一个点;

           x               y

    |————|  |———|

    l1          r1  l2        r2 

    将x y区间合并时 f[y]=x;

    还要将 r1.nxt=l2;

    再将r1=r2;

    合并后区间

        xy

    |—————————|

    l1                             r2 

      

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int maxn=2e5+10;
    
    int f[maxn];
    
    deque<int>q;
    
    struct node{
        int l,r,nxt;
    }e[maxn];///左端 右端 下一个点
    
    int root(int x)
    {
        return f[x]=(f[x]==x?x:root(f[x]));
    }
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            f[i]=e[i].l=e[i].r=i;
        for(int i=1;i<n;i++)
        {
            int x,y;
            cin>>x>>y;
            x=root(x),y=root(y);
            f[x]=y;///合并区间
            e[e[y].r].nxt=e[x].l;///将y右区间的下一个点 指向x区间的左端
            e[y].r=e[x].r;///将y区间右更新成x的右端
        }
        int st=e[root(1)].l;///起点
        while(st)
        {
            cout<<st<<" ";
            st=e[st].nxt;
        }
        return 0;
    }
  • 相关阅读:
    窗口
    DataTemplateSelector
    CompositeCollection
    Drawing
    模板
    集合视图
    绑定
    动画
    【数据结构初学】(java实现篇)——队列(转)
    慕课学习手记!(完成查找书籍小程序~)
  • 原文地址:https://www.cnblogs.com/minun/p/11252657.html
Copyright © 2011-2022 走看看