Educational Codeforces Round 49 (Rated for Div. 2) F - Session in BSU

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cys460714380/article/details/82049363

一个人选一个点 也就是可以看成一条边要选一个点
那么就只要单独考虑一个个联通块就可以了

一个点代表一个时间 假设这个联通块的点数<边数
就代表人数>可选时间数 不可行

假如 点数 = 边数
也就是所有点都必须选 取最大值

假如 点数>边数 说明这是一棵树
丢掉最大值取次大

#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <queue>
#include <cstdio>
#include <map>
#include <set>
#include <utility>
#include <stack>
#include <cstring>
#include <cmath>
#include <vector>
#include <ctime>
#include <bitset>
#include <assert.h>
using namespace std;
#define pb push_back
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define ansn() printf("%d\n",ans)
#define lansn() printf("%lld\n",ans)
#define r0(i,n) for(int i=0;i<(n);++i)
#define r1(i,e) for(int i=1;i<=e;++i)
#define rn(i,e) for(int i=e;i>=1;--i)
#define mst(abc,bca) memset(abc,bca,sizeof abc)
#define lowbit(a) (a&(-a))
#define all(a) a.begin(),a.end()
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp(aa,bb) make_pair(aa,bb)
#define lrt rt<<1
#define rrt rt<<1|1
#define X first
#define Y second
#define PI (acos(-1.0))
double pi = acos(-1.0);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
//const ll mod = 1000000007;
const double eps=1e-12;
const int inf=0x3f3f3f3f;
//const ll infl = 100000000000000000;//1e17
const int maxn=  2e6+20;
const int maxm = 5e3+20;
//muv[i]=(p-(p/i))*muv[p%i]%p;
int in(int &ret) {
    char c;
    int sgn ;
    if(c=getchar(),c==EOF)return -1;
    while(c!='-'&&(c<'0'||c>'9'))c=getchar();
    sgn = (c=='-')?-1:1;
    ret = (c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0');
    ret *=sgn;
    return 1;
}

vector<int>v;
int id(int x) {
    return lower_bound(all(v),x) - v.begin() + 1 ;
}
int a[maxn],b[maxn];
int d[maxn];
int fa[maxn];
int faf(int x) {
    return fa[x]==x?x:fa[x] = faf(fa[x]);
}
void un(int q,int w) {
    int f1 = faf(q),f2 = faf(w);
    if(f1!=f2)fa[f2]=f1,d[f1] += d[f2];
}
int e[maxn];
vector<int> p[maxn];
int main() {
#ifdef LOCAL
    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
#endif // LOCAL

    int n;
    sd(n);
    r1(i,n)sdd(a[i],b[i]),v.pb(a[i]),v.pb(b[i]);
    r1(i,2*n)d[i] = 1,fa[i] = i;
    sort(all(v));
    v.erase(unique(all(v)),v.end());
    r1(i,n)a[i] = id(a[i]),b[i] = id(b[i]),un(a[i],b[i]);
    r1(i,n) {
        int ff = faf(a[i]);
        ++e[ff];
        p[ff].pb(a[i]);
        p[ff].pb(b[i]);
    }
    int ans = -1;
    r1(i,2*n) {
        if(faf(i)!=i)continue;
        int sz = e[i];
        if(!sz)continue;
        if(sz>d[i])return 0*puts("-1");
        sort(all(p[i]));
        p[i].erase(unique(all(p[i])),p[i].end());
        if(sz==d[i]) ans = max(ans,p[i][sz-1]);
        else ans = max(p[i][sz-1],ans);
    }
    ans = v[ans-1];
    ansn();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cys460714380/article/details/82049363