CF1027F Session in BSU (并查集+树上构造)
题目大意:你可以在第$ai$天或者第$bi$天进行第$i$场考试,每天最多进行一场考试,求把所有考试都考完的最早结束时间
由于天数可能很大,需要离散
把问题抽象成一棵树,每个点最多被"分配"一条边,现在要删点
画画图可以发现
如果一个联通块是一棵树,那么可以删去至多一个点
如果一个联通块是一个单环树(n个点n条边),那么一个点都不能删掉
如果一个联通块边数大于点数,会发现无法把每个点只分配一条边,不合法,输出-1
判树还是单环树,求一个联通块内点的度总和/2和点数比较即可
并查集维护一下点属于哪个联通块即可
注意点数是$2*10^6$而不是$1*10^6$
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 2000100
#define maxn 100000
#define ll long long
#define mod 1000000007
#define iset multiset<node>::iterator
using namespace std;
//re
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,K,ma,cte,num;
int head[N],inc[N],id[N*],vis[N],fa[N],sum[N],sz[N],typ[N];
struct E{int x,y;}e[N];
struct Edge{int to,nxt,val;}edge[N*];
void ae(int u,int v){
cte++;edge[cte].to=v,inc[v]++;
edge[cte].nxt=head[u],head[u]=cte;}
int find_fa(int x){
int y=x,pre;while(fa[y]!=y){y=fa[y];}
while(fa[x]!=y){pre=fa[x],fa[x]=y,x=pre;}
return y;
}
int dfs(int u)
{
vis[u]=;int ans=;
for(int j=head[u];j;j=edge[j].nxt){
int v=edge[j].to;
if(vis[v]) continue;
fa[v]=u,ans+=dfs(v),sz[u]+=sz[v];
}sz[u]+=inc[u];return ans;
} int main()
{
scanf("%d",&n);
int x,y,z,fx;
for(int i=;i<=n;i++)
e[i].x=gint(),e[i].y=gint(),
id[++num]=e[i].x,id[++num]=e[i].y;
sort(id+,id+num+);
num=unique(id+,id+num+)-(id+);
for(int i=;i<=n;i++){
x=lower_bound(id+,id+num+,e[i].x)-id;
y=lower_bound(id+,id+num+,e[i].y)-id;
ae(x,y),ae(y,x);
}int tot;
for(int i=;i<=num;i++) fa[i]=i;
for(int i=;i<=num;i++)
if(!vis[i]){
sum[i]=dfs(i);
if(sum[i]==(sz[i]+)/)
typ[i]=;
else if(sum[i]==(sz[i]/))
typ[i]=;
else{printf("-1\n");return ;}
}
int ans=num;
for(int i=num;i>=;i--){
fx=find_fa(i);
if(typ[fx]==) {typ[fx]=;ans=i-;}
else break;
}
printf("%d\n",id[ans]);
return ;
}
CF1027F Session in BSU (并查集+树上构造)的更多相关文章
- cf1027F. Session in BSU(并查集 匈牙利)
题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...
- Codeforces 1027F Session in BSU - 并查集
题目传送门 传送门I 传送门II 传送门III 题目大意 有$n$门科目有考试,第$i$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)$,要求每门科目至少参加 ...
- [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]
题面 传送门 思路 真是一道神奇的题目呢 题目本身可以转化为二分图匹配问题,要求右半部分选择的点的最大编号最小的一组完美匹配 注意到这里左边半部分有一个性质:每个点恰好连出两条边到右半部分 那么我们可 ...
- CF1027F Session in BSU
link 花絮: 这场看起来打得还不错的样子……(别问我是用哪个号打的). 然后听说这题的思想被出了好多次,女生赛也出过,quailty算法,然而当时没反应过来,而且时间不多啦. 题意: 有n个人,每 ...
- [CF1027F]Session in BSU[最小基环树森林]
题意 有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程. \(n\leq 10^6\). 分析 类似 [BZOJ ...
- hdu 2545 并查集 树上战争
#include<stdio.h> #include<string.h> #define N 110000 struct node { int father,count ...
- 并查集(删除) UVA 11987 Almost Union-Find
题目传送门 题意:训练指南P246 分析:主要是第二种操作难办,并查集如何支持删除操作?很巧妙的方法:将并查集树上p的影响消除,即在祖先上(sz--, sum -= p),然后为p换上马甲:id[p] ...
- 【PAT-并查集-水题】L2-007-家庭房产
L2-007. 家庭房产 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下 ...
- (step5.1.2)hdu 2473(Junk-Mail Filter——并查集)
题目大意:输入两个整数n,m(n表示点的个数,m表示操作数).在接下来的m行中,对点的操作有两种 1)M a b . 表示将a.b并到一个集合中 2)S a .表示将a从原来的集合中去除,而成为一个单 ...
随机推荐
- 关于HTML表格中插入背景图片的问题_百度知道 3个回答 - 提问时间: 2009年03月23日 最佳答案: <tr style="background-image:url(1.jpg)"> (这事设置背景图片) <img src="images/bbs_student1.gif" />如果是这样的就是直接插入图片。你看看,...
关于HTML表格中插入背景图片的问题_百度知道 3个回答 - 提问时间: 2009年03月23日 最佳答案: <tr style="background-image:url(1.jpg ...
- Project Euler 47 Distinct primes factors( 筛法记录不同素因子个数 )
题意: 首次出现连续两个数均有两个不同的质因数是在: 14 = 2 × 715 = 3 × 5 首次出现连续三个数均有三个不同的质因数是在: 644 = 22 × 7 × 23645 = 3 × 5 ...
- POJ 2395 Out of Hay( 最小生成树 )
链接:传送门 题意:求最小生成树中的权值最大边 /************************************************************************* & ...
- P1265 公路修建 (prim)
题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一"行路难"的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮 ...
- ubuntu上的arm-elf-tools -20040427.sh 下载及安装问题的解决
要完成uclinux在ARM上的移植,必须有这个工具. 下载地址:http://opensrc.sec.samsung.com/download.html 这个网站上还有许多其它资源可以下载.我选择 ...
- 邓_ php SESSION
学会php session可以在很多地方使用,比如做一个后台登录的功能,要让程序记住用户的session,其实很简单,看了下面的文章你就明白了. PHP session用法其实很简单它可以把用户提交的 ...
- TS3
let [first, ...rest] = [1, 2, 3, 4]; console.log(first); // outputs 1 console.log(rest); // outputs ...
- 0x21 剪枝
这一章真是心态崩,剪枝太玄学啦,特别是那个搜索顺序我靠真的... poj1011 枚举答案,搜索记录当前到第几根木棒. 剪枝:1.从大到小排序 2.排除等效,这个感觉还行,就是木棒按大小顺序进去,去除 ...
- Swift - 获取应用名称、应用版本、设备型号、系统版本等信息
有时我们在 App 中提交一些统计信息或者用户反馈信息时,为了能更好地进行分析,通常会附带上当前应用程序的名称.版本号.设备型号.以及设备系统版本.下面演示如何获取这些信息. 1,效果图 程序启动后自 ...
- 英语发音规则---C字母
英语发音规则---C字母 一.总结 一句话总结: 1.C发[k]音? cake [keɪk] n. 蛋糕 coat [kəʊt] n. 外套 music ['mjuːzɪk] n. 音乐,乐曲 pic ...