题意:给出n场考试,每场考试有2天可以通过(第ai与bi天)。每天最多参加一场考试,现在要求所有考试全部通过的最小天数

n<=1e6,1<=a[i]<b[i]<1e9

思路:From https://blog.csdn.net/qq_34454069/article/details/81835772

维护块内最大值,次大值,点数,边数

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<bitset>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define mem0(a) memset(a,0,sizeof(a))
#define N 2100000
#define M 51
#define MOD 998244353
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 struct node
{
int x,y;
}a[N]; int s[N][],b[N],f[N],g[N],v[N],Data[N],c[N]; void prepare(int *x,int n)
{
for(int i=;i<=n;i++) Data[i]=x[i];
sort(Data+,Data+n+);
int m=unique(Data+,Data+n+)-Data-;
for(int i=;i<=n;i++) x[i]=lower_bound(Data+,Data+m+,x[i])-Data;
} int find(int k)
{
if(f[k]!=k) f[k]=find(f[k]);
return f[k];
} int main()
{
int n;
scanf("%d",&n);
int m=;
for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=;i<=n;i++) b[++m]=a[i].x;
for(int i=;i<=n;i++) b[++m]=a[i].y;
prepare(b,m);
for(int i=;i<=n;i++)
{
c[b[i]]=a[i].x;
c[b[i+n]]=a[i].y;
a[i].x=b[i];
a[i].y=b[i+n];
}
int id=;
for(int i=;i<=m;i++) id=max(id,b[i]);
for(int i=;i<=id;i++)
{
f[i]=i;
g[i]=;
v[i]=;
s[i][]=i;
s[i][]=-;
}
for(int i=;i<=n;i++)
{
int x=find(a[i].x);
int y=find(a[i].y);
if(x!=y)
{
f[x]=y;
g[y]=g[x]+g[y]+;
v[y]=v[x]+v[y];
if(s[x][]>s[y][])
{
s[y][]=s[x][];
if(s[y][]>s[y][]) swap(s[y][],s[y][]);
}
if(s[x][]>s[y][])
{
s[y][]=s[x][];
if(s[y][]>s[y][]) swap(s[y][],s[y][]);
}
}
else g[x]++;
}
int ans=-;
for(int i=;i<=id;i++)
{
if(v[i]==g[i]+) ans=max(ans,s[i][]);
else if(v[i]==g[i]) ans=max(ans,s[i][]);
else
{
ans=-;
break;
}
}
if(ans!=-) printf("%d\n",c[ans]);
else printf("-1\n");
return ;
}

最新文章

  1. WordPress安装使用问题记录
  2. React问答小demo
  3. HDU 4009 Transfer water
  4. 几个linux 下C/C++集成开发环境推荐
  5. CodeForces 711C Coloring Trees
  6. Vijos1523贪吃的九头龙【树形DP】
  7. asp.net core教程 (二)
  8. 201521123008&lt;java程序设计&gt;第三周实验总结
  9. SharePoint Framework 简介
  10. 【Luogu1471】方差(线段树)
  11. [HAOI 2009]逆序对数列
  12. 转 Web用户的身份验证及WebApi权限验证流程的设计和实现
  13. 消耗CPU和内存的脚本
  14. LNMP的配置与优化
  15. android 开发 框架系列 使用 FileDownloader 实现检查更新的功能class
  16. 微服务日志之Spring Boot Kafka实现日志收集
  17. centos所有版本下载源
  18. 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设
  19. 论文笔记:2018 PRCV 顶会顶刊墙展
  20. Sametime SDK

热门文章

  1. term &quot;JavaScript&quot;
  2. POJ 3860 Fruit Weights(数学+最长路径 or 最短路径)
  3. C++STL——list
  4. 望岳物业App开发过程记录
  5. poj1789 Truck History最小生成树
  6. WebKit资源加载和网络栈
  7. jsp实用过滤器写法
  8. 大步小步算法模板题, poj2417
  9. Notice : brew install php70
  10. BZOJ1095 [ZJOI2007]Hide 捉迷藏 【动态点分治 + 堆】