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;
}
原文地址:https://www.cnblogs.com/minun/p/11252657.html