【CF1027F】Session in BSU(dsu,基环树)
题意:给出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 ;
- }
【CF1027F】Session in BSU(dsu,基环树)的更多相关文章
- [CF1027F]Session in BSU[最小基环树森林]
题意 有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程. \(n\leq 10^6\). 分析 类似 [BZOJ ...
- CF1027F Session in BSU
link 花絮: 这场看起来打得还不错的样子……(别问我是用哪个号打的). 然后听说这题的思想被出了好多次,女生赛也出过,quailty算法,然而当时没反应过来,而且时间不多啦. 题意: 有n个人,每 ...
- cf1027F. Session in BSU(并查集 匈牙利)
题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...
- CF1027F Session in BSU (并查集+树上构造)
题目大意:你可以在第$ai$天或者第$bi$天进行第$i$场考试,每天最多进行一场考试,求把所有考试都考完的最早结束时间 由于天数可能很大,需要离散 把问题抽象成一棵树,每个点最多被"分配& ...
- Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)
题意: 有n门考试,每门考试都有两个时间,存在几门考试时间冲突,求考完所有的考试,所用的最后时间的最小值 解析: 对于时间冲突的考试 就是一个联通块 把每个考试看作边,两个时间看作点,那么时间冲突的考 ...
- Solution -「基环树」做题记录
写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...
- codeforces1027F. Session in BSU
题目链接 codeforces1027F. Session in BSU 题解 二分图匹配就fst了....显然是过去的,不过tle test87估计也pp了,好坑 那么对于上面做匹配的这个二分图分情 ...
- CF 1027 F. Session in BSU
F. Session in BSU https://codeforces.com/contest/1027/problem/F 题意: n场考试,每场可以安排在第ai天或者第bi天,问n场考完最少需要 ...
- 【BZOJ1791】【IOI2008】【基环树】island(status第一速度)
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 908 Solved: 159 [Su ...
- 『Island 基环树直径』
Island(IOI 2008) Description 你准备浏览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿 i 出发向另外一个岛屿建了一座长度为 L_i 的桥,不过桥是可以双向行走 ...
随机推荐
- nodejs环境搭建与express安装配置
一.NPM 1.下载nodeJS 下载地址:https://nodejs.org/en/download/ 因为我的系统是Linux 的,所以下载已经编译好的Linux,nodejs tar包 3.下 ...
- Returning Values from Bash Functions
转自:https://www.linuxjournal.com/content/return-values-bash-functions Bash functions, unlike function ...
- 【个人训练】(UVa146)ID Codes
题意与解析 这题其实特别简单,求给定排列的后继.使用stl(next_permutation)可以方便地解决这个问题.但是,想要自己动手解就是另外一回事了.我的解法是从后往前找到第一个$a_i$比$a ...
- Sumsets 递推
Sumsets Time Limit : 6000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submi ...
- 自动化测试---mybatis的使用
mybatis如何实现了对数据库的操作: 1.通过Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加载mybatis. ...
- spring多个定时任务quartz配置
spring多个定时任务quartz配置 <?xml version=”1.0″ encoding=”UTF-8″?> <beans xmlns=”http://www.spring ...
- git部署详解
1.1 关于版本控制 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别.这么做唯一的 好处就是简单,但是特别容易犯错.有 ...
- 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 ...
- 关于c++的头文件依赖
正在看google c++编程规范,里面对头文件依赖是这么说的: 使用前置声明(forward declarations)尽量减少.h文件中#include的数量. 当一个头文件被包含的同时也引入了一 ...
- DP入门(4)——线性结构上的动态规划
一.最长上升子序列(LIS) 给定n个整数A1,A2,…,An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1,6,2,3,7 ...