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

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

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

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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<vector>
  11. #include<bitset>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef unsigned int uint;
  15. typedef unsigned long long ull;
  16. typedef pair<int,int> PII;
  17. typedef vector<int> VI;
  18. #define fi first
  19. #define se second
  20. #define MP make_pair
  21. #define mem0(a) memset(a,0,sizeof(a))
  22. #define N 2100000
  23. #define M 51
  24. #define MOD 998244353
  25. #define eps 1e-8
  26. #define pi acos(-1)
  27. #define oo 1e9
  28.  
  29. struct node
  30. {
  31. int x,y;
  32. }a[N];
  33.  
  34. int s[N][],b[N],f[N],g[N],v[N],Data[N],c[N];
  35.  
  36. void prepare(int *x,int n)
  37. {
  38. for(int i=;i<=n;i++) Data[i]=x[i];
  39. sort(Data+,Data+n+);
  40. int m=unique(Data+,Data+n+)-Data-;
  41. for(int i=;i<=n;i++) x[i]=lower_bound(Data+,Data+m+,x[i])-Data;
  42. }
  43.  
  44. int find(int k)
  45. {
  46. if(f[k]!=k) f[k]=find(f[k]);
  47. return f[k];
  48. }
  49.  
  50. int main()
  51. {
  52. int n;
  53. scanf("%d",&n);
  54. int m=;
  55. for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
  56. for(int i=;i<=n;i++) b[++m]=a[i].x;
  57. for(int i=;i<=n;i++) b[++m]=a[i].y;
  58. prepare(b,m);
  59. for(int i=;i<=n;i++)
  60. {
  61. c[b[i]]=a[i].x;
  62. c[b[i+n]]=a[i].y;
  63. a[i].x=b[i];
  64. a[i].y=b[i+n];
  65. }
  66. int id=;
  67. for(int i=;i<=m;i++) id=max(id,b[i]);
  68. for(int i=;i<=id;i++)
  69. {
  70. f[i]=i;
  71. g[i]=;
  72. v[i]=;
  73. s[i][]=i;
  74. s[i][]=-;
  75. }
  76. for(int i=;i<=n;i++)
  77. {
  78. int x=find(a[i].x);
  79. int y=find(a[i].y);
  80. if(x!=y)
  81. {
  82. f[x]=y;
  83. g[y]=g[x]+g[y]+;
  84. v[y]=v[x]+v[y];
  85. if(s[x][]>s[y][])
  86. {
  87. s[y][]=s[x][];
  88. if(s[y][]>s[y][]) swap(s[y][],s[y][]);
  89. }
  90. if(s[x][]>s[y][])
  91. {
  92. s[y][]=s[x][];
  93. if(s[y][]>s[y][]) swap(s[y][],s[y][]);
  94. }
  95. }
  96. else g[x]++;
  97. }
  98. int ans=-;
  99. for(int i=;i<=id;i++)
  100. {
  101. if(v[i]==g[i]+) ans=max(ans,s[i][]);
  102. else if(v[i]==g[i]) ans=max(ans,s[i][]);
  103. else
  104. {
  105. ans=-;
  106. break;
  107. }
  108. }
  109. if(ans!=-) printf("%d\n",c[ans]);
  110. else printf("-1\n");
  111. return ;
  112. }

【CF1027F】Session in BSU(dsu,基环树)的更多相关文章

  1. [CF1027F]Session in BSU[最小基环树森林]

    题意 有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程. \(n\leq 10^6\). 分析 类似 [BZOJ ...

  2. CF1027F Session in BSU

    link 花絮: 这场看起来打得还不错的样子……(别问我是用哪个号打的). 然后听说这题的思想被出了好多次,女生赛也出过,quailty算法,然而当时没反应过来,而且时间不多啦. 题意: 有n个人,每 ...

  3. cf1027F. Session in BSU(并查集 匈牙利)

    题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...

  4. CF1027F Session in BSU (并查集+树上构造)

    题目大意:你可以在第$ai$天或者第$bi$天进行第$i$场考试,每天最多进行一场考试,求把所有考试都考完的最早结束时间 由于天数可能很大,需要离散 把问题抽象成一棵树,每个点最多被"分配& ...

  5. Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)

    题意: 有n门考试,每门考试都有两个时间,存在几门考试时间冲突,求考完所有的考试,所用的最后时间的最小值 解析: 对于时间冲突的考试 就是一个联通块 把每个考试看作边,两个时间看作点,那么时间冲突的考 ...

  6. Solution -「基环树」做题记录

    写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...

  7. codeforces1027F. Session in BSU

    题目链接 codeforces1027F. Session in BSU 题解 二分图匹配就fst了....显然是过去的,不过tle test87估计也pp了,好坑 那么对于上面做匹配的这个二分图分情 ...

  8. CF 1027 F. Session in BSU

    F. Session in BSU https://codeforces.com/contest/1027/problem/F 题意: n场考试,每场可以安排在第ai天或者第bi天,问n场考完最少需要 ...

  9. 【BZOJ1791】【IOI2008】【基环树】island(status第一速度)

      1791: [Ioi2008]Island 岛屿  Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 908  Solved: 159 [Su ...

  10. 『Island 基环树直径』

    Island(IOI 2008) Description 你准备浏览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿 i 出发向另外一个岛屿建了一座长度为 L_i 的桥,不过桥是可以双向行走 ...

随机推荐

  1. nodejs环境搭建与express安装配置

    一.NPM 1.下载nodeJS 下载地址:https://nodejs.org/en/download/ 因为我的系统是Linux 的,所以下载已经编译好的Linux,nodejs tar包 3.下 ...

  2. Returning Values from Bash Functions

    转自:https://www.linuxjournal.com/content/return-values-bash-functions Bash functions, unlike function ...

  3. 【个人训练】(UVa146)ID Codes

    题意与解析 这题其实特别简单,求给定排列的后继.使用stl(next_permutation)可以方便地解决这个问题.但是,想要自己动手解就是另外一回事了.我的解法是从后往前找到第一个$a_i$比$a ...

  4. Sumsets 递推

    Sumsets Time Limit : 6000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submi ...

  5. 自动化测试---mybatis的使用

    mybatis如何实现了对数据库的操作: 1.通过Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加载mybatis. ...

  6. spring多个定时任务quartz配置

    spring多个定时任务quartz配置 <?xml version=”1.0″ encoding=”UTF-8″?> <beans xmlns=”http://www.spring ...

  7. git部署详解

    1.1 关于版本控制 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别.这么做唯一的 好处就是简单,但是特别容易犯错.有 ...

  8. Leetcode 54. Spiral Matrix & 59. Spiral Matrix II

    54. Spiral Matrix [Medium] Description Given a matrix of m x n elements (m rows, n columns), return ...

  9. 关于c++的头文件依赖

    正在看google c++编程规范,里面对头文件依赖是这么说的: 使用前置声明(forward declarations)尽量减少.h文件中#include的数量. 当一个头文件被包含的同时也引入了一 ...

  10. DP入门(4)——线性结构上的动态规划

    一.最长上升子序列(LIS) 给定n个整数A1,A2,…,An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1,6,2,3,7 ...