Codeforces1027F Session in BSU

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/81840853

全世界都在考基环树系列,一场CF考了两题基环树。。。。。。
AC Code:

#include<cstdio>
#include<cstring>
#include<cctype>
#include<vector>
#include<cmath>
#include<algorithm>
#define maxn 2000005
#define LL long long
#define mod 998244353
using namespace std;

int n,a[maxn],b[maxn],num[maxn*2];
int info[maxn*2],Prev[maxn*2],to[maxn*2],cnt_e;
inline void Node(int u,int v){Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v;}
bool vis[maxn];
int siz,edge,Max,sMax;

void dfs(int now)
{
    if(vis[now]) return;
    if(now > Max) sMax = Max , Max = now;
    else if(now > sMax) sMax = now;
    vis[now]=1;
    siz++;
    for(int i=info[now];i;i=Prev[i])
    {
        edge++;
        dfs(to[i]);
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]),num[++num[0]] = a[i] , num[++num[0]] = b[i];
    sort(num+1,num+1+num[0]);
    num[0] = unique(num+1 , num+1+num[0]) - num - 1;
    for(int i=1;i<=n;i++)
        a[i] = lower_bound(num+1,num+1+num[0],a[i])-num,
        b[i] = lower_bound(num+1,num+1+num[0],b[i])-num,
        Node(b[i],a[i]),Node(a[i],b[i]);

    int ans = 0 ;
    for(int i=num[0];i>=1;i--)
        if(!vis[i])
        {
            sMax=Max=siz=edge=0;
            dfs(i);
            if(edge / 2 > siz){puts("-1");return 0;}
            else if(edge / 2 == siz) ans = max(ans , Max);
            else ans = max(ans , sMax);
        }

    printf("%d\n",num[ans]);
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/81840853
今日推荐