题意

有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程。

\(n\leq 10^6\)。

分析

  • 类似 [BZOJ4883]棋盘上的守卫 一题。

  • 将每门课程对应的两天连边,如果课程 \(i\) 要在第 \(x\) 天考,则对应边指向 \(x\) 。

  • 最后有 \(n\) 天,\(n\) 条有向边,每条边的入度为1,构成了基环树森林。

  • 总时间复杂度为 \(O(nlogn)\) (离散化)。

总结:这种 \(A\) 可以选择两种物品之一,每种物品最多被一个人选择的问题可以考虑基环树。

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
typedef long double ld;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T> inline bool Max(T& a, const T& b) {
return a < b ? a = b, true : false;
}
template<typename T> inline bool Min(T& a, const T& b) {
return a > b ? a = b, true : false;
}
const int N=1e6 + 7;
int n,len,ans;
int V[N<<1],par[N<<1],cir[N<<1],mx[N<<1],a[N],b[N];
int getpar(int a){return par[a]==a?a:par[a]=getpar(par[a]);}
int main(){
n=gi();
rep(i,1,n+n) par[i]=i;
rep(i,1,n) V[++len]=a[i]=gi(),V[++len]=b[i]=gi();
sort(V+1,V+1+len);
len=unique(V+1,V+1+len)-V-1;
rep(i,1,n){
a[i]=lower_bound(V+1,V+1+len,a[i])-V;
b[i]=lower_bound(V+1,V+1+len,b[i])-V;
int f1=getpar(a[i]),f2=getpar(b[i]);
if(cir[f1]&&cir[f2]) return puts("-1"),0;
if(f1>f2) swap(f1,f2);Max(ans,V[f1]);
if(f1==f2) {cir[f2]=1;continue;}
par[f1]=f2,cir[f2]|=cir[f1];
}
printf("%d\n",ans);
return 0;
}

[CF1027F]Session in BSU[最小基环树森林]的更多相关文章

  1. [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]

    题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...

  2. bzoj4883 [Lydsy1705月赛]棋盘上的守卫 最小生成基环树森林

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4883 题解 每一行和每一列都必须要被覆盖. 考虑对于每一行和每一列都建立一个点,一行和一列之间 ...

  3. bzoj1040 基环树森林dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1040 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社 ...

  4. BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小环套树森林&优化定向问题)

    4883: [Lydsy1705月赛]棋盘上的守卫 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 475  Solved: 259[Submit][St ...

  5. 【bzoj4883】[Lydsy2017年5月月赛]棋盘上的守卫 最小环套树森林

    题目描述 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个 ...

  6. CF1027F Session in BSU

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

  7. CF875F Royal Questions[最大生成基环树森林]

    这题这场比赛一堆人秒切..果然还是我太菜了吗 题意:二分图,右边$m$个点每个点$i$向左边有且仅有两条连边,边权都是$a_i$.求最大匹配. 一个朴素思想,二分图匹配,用贪心带匈牙利搞一搞,但是复杂 ...

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

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

  9. 【CF875F】Royal Questions 最小生成基环树森林

    [CF875F]Royal Questions 题意:国王的n个王子该结婚了!现在从外国来了m位公主,第i位公主的嫁妆是wi.由于进步思想的传播,每个公主在选择配偶的事情上是有自主权的,具体地,每个公 ...

随机推荐

  1. swift关于UIView设置frame值的extension

    swift关于UIView设置frame值的extension 使用 说明 1. 使用如上图,很简单,不再赘述 2. 在extension给添加的计算属性提供getter,setter方法即可 源码 ...

  2. Python(二)列表的增删改查

    一,列表的增删改查 列表中增加元素: 1,从列表的末尾增加一个元素:append("") 2,从列表中插入一个元素:insert(下标位置,插入的元素) 合并列表: 1,name. ...

  3. 【C语言】 任意十进制数字转十六进制

    大概思路:输入任意十进制数字 首先确定位数: 使用整形数组来存储十六进制数: a[0] 表示十六进制数字的位数: #include <stdio.h> #include <stdli ...

  4. Ubuntu通过Pyenv管理python版本

    网上安装使用Pyenv的教程很多,但是实测有很多教程有坑,经过多家比较发现下面的教程可用,内容全面,与大家分享. 首先安装pyenv全家桶 curl -L https://raw.githubuser ...

  5. JDK1.6在LINUX下的安装配置[转]

    JDK1.6在LINUX下的安装是如何进行的呢,让我们开始我们的演示: Ubuntu Linux下jdk的安装与配置 1.JDK1.6安装准备 从sun公司网站www.sun.com下载linux版本 ...

  6. Python中的赋值和拷贝

    赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.比如: >>> a=[1,2,3] >>> b=a >>> c= ...

  7. 【[TJOI2015]弦论】

    \(SA+SAM\) 第一问显然是一个\(SAM\)的经典问题,我们排完序之后直接使用一直往下找\(n+1-sa[i]-het[i]\)就好了,找到\(K\)减不动了输出就好了 第二问是\(SAM\) ...

  8. 使用nginx替换Ingress

    总感觉k8s Ingress 不可控, 所以使用nginx 替换Ingress,还是比较简单的. apiVersion: extensions/v1beta1 kind: DaemonSet meta ...

  9. Linux环境更改Jenkins的主目录

    Linux环境更改Jenkins的主目录 Linux环境中,Jenkins主目录默认在/root/.jenkins Jenkins储存所有的数据文件在这个目录下. 你可以通过以下几种方式更改: 1.使 ...

  10. R执行报错:Error in `[<-.ts`(`*tmp*`,...only replacement of elements is allowed

    原因: pred$mean是Time-Series类型,rbind函数不支持.通过as.double将其转换成double类型即可. 修改前代码: all_predata_time <- dat ...