F. Session in BSU

https://codeforces.com/contest/1027/problem/F

题意:

  n场考试,每场可以安排在第ai天或者第bi天,问n场考完最少需要多少天。

分析:

  将所有的a与b连边,一条边相当于一场考试,一个点相当于一个考试时间,每条边需要找一个点。

  那么在一个联通块中,边数>点数,无解(这些考试都只能在这个联通块内的点考)。

  如果边数=点数,那么相当于出现了环,每条边和一个点匹配,即n场考试,n个考试时间,所以这个联通块内的答案就是最大的点。

  如果边数<点数,那么一定是一棵树,那么所有的最大的时间点就可以不选了,这个联通块内的答案就是次大值。

  并查集维护加边,与当期联通块的情况。加入一个条边,合并两个联通块,对新联通块维护最大值和次大值。

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; struct Node{
int a,b;
}A[N >> ];
int Num[N], fa[N], fir[N], sec[N], tag[N]; int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main() {
int n = read(), cnt = ;
for (int i=; i<=n; ++i) {
A[i].a = read(), A[i].b = read();
Num[++cnt] = A[i].a, Num[++cnt] = A[i].b;
}
sort(Num + , Num + cnt + );
int lim = cnt;cnt = ;
for (int i=; i<=lim; ++i) if (Num[i] != Num[cnt]) Num[++cnt] = Num[i];
for (int i=; i<=n; ++i) {
A[i].a = lower_bound(Num + , Num + cnt + , A[i].a) - Num;
A[i].b = lower_bound(Num + , Num + cnt + , A[i].b) - Num;
}
for (int i=; i<=cnt; ++i) fa[i] = i, fir[i] = Num[i];
for (int i=; i<=n; ++i) {
int u = find(A[i].a), v = find(A[i].b);
if (u != v) {
fa[v] = u; tag[u] |= tag[v];
if (fir[v] > fir[u]) sec[u] = max(fir[u], sec[v]), fir[u] = fir[v];
else sec[u] = max(sec[u], fir[v]);
}
else if (tag[u]) {
puts("-1"); return ;
}
else tag[u] = ;
}
int Ans = ;
for (int i=; i<=cnt; ++i) {
if (i == find(i)) {
if (tag[i]) Ans = max(Ans, fir[i]);
else Ans = max(Ans, sec[i]);
}
}
cout << Ans; return ;
}

CF 1027 F. Session in BSU的更多相关文章

  1. [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]

    题面 传送门 思路 真是一道神奇的题目呢 题目本身可以转化为二分图匹配问题,要求右半部分选择的点的最大编号最小的一组完美匹配 注意到这里左边半部分有一个性质:每个点恰好连出两条边到右半部分 那么我们可 ...

  2. codeforces1027F. Session in BSU

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

  3. Codeforces 1027F. Session in BSU

    题目直通车:Codeforces 1027F. Session in BSU 思路: 对第一门考试,使用前一个时间,做标记,表示该时间已经用过,并让第一个时间指向第二个时间,表示,若之后的考试时间和当 ...

  4. CF 633 F. The Chocolate Spree 树形dp

    题目链接 CF 633 F. The Chocolate Spree 题解 维护子数答案 子数直径 子数最远点 单子数最长直径 (最长的 最远点+一条链) 讨论转移 代码 #include<ve ...

  5. [Codeforces Round49F] Session in BSU

    [题目链接] http://codeforces.com/contest/1027/problem/F [算法] 二分图匹配 [代码] #include<bits/stdc++.h> #p ...

  6. CF #271 F Ant colony 树

    题目链接:http://codeforces.com/contest/474/problem/F 一个数组,每一次询问一个区间中有多少个数字可以整除其他所有区间内的数字. 能够整除其他所有数字的数一定 ...

  7. CF 494 F. Abbreviation(动态规划)

    题目链接:[http://codeforces.com/contest/1003/problem/F] 题意:给出一个n字符串,这些字符串按顺序组成一个文本,字符串之间用空格隔开,文本的大小是字母+空 ...

  8. CF 1138 F. Cooperative Game

    F. Cooperative Game 链接 题意: 有10个玩家,开始所有玩家在home处,每次可以让一些玩家沿着边前进一步,要求在3(t+c)步以内,到达终点. 分析: 很有意思的一道题.我们构造 ...

  9. CF 1041 F. Ray in the tube

    F. Ray in the tube 链接 题意: 有两条平行于x轴的直线A,B,每条直线上的某些位置有传感器.你需要确定A,B轴上任意两个整点位置$x_a$,$x_b$,使得一条光线沿$x_a→x_ ...

随机推荐

  1. Java 中的引用

    JVM 是根据可达性分析算法找出需要回收的对象,判断对象的存活状态都和引用有关. 在 JDK1.2 之前这点设计的非常简单:一个对象的状态只有引用和没被引用两种区别. 这样的划分对垃圾回收不是很友好, ...

  2. Android(java)学习笔记208:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...

  3. git 比较不同版本文件的差异

    Git 比较不同版本文件差异的常用命令格式: git diff 查看尚未暂存的文件更新了哪些部分 git diff filename 查看尚未暂存的某个文件更新了哪些 git diff –cached ...

  4. Linux Shell 编程 文件转置问题

    给定一个文件 file.txt,转置它的内容. 你可以假设每行列数相同,并且每个字段由 ' ' 分隔. 示例: 假设 file.txt 文件内容如下: name age alice 21 ryan 3 ...

  5. [转]MFC子线程更改图像数据后更新主窗口图像显示方法

    程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...

  6. Oracle中转义下划线

    原意是查询出所有的月粒度模型,但是在oracle中,下划线也代表匹配单一任何字符,导致15分钟粒度的模型也被查询出来,在此,需要对下划线做转义,使其只表示下划线的含义,可以使用ESCAPE()函数. ...

  7. [videos系列]日本的videos视频让男人产生了哪些误解?

    转载自:[videos系列]日本的videos视频让男人产生了哪些误解? 日本的videos视频是每个男人成长过程中都会看的启蒙教育片,也是男人在成年后调剂生活的必需品,但是由于影视作品是艺术的,是属 ...

  8. mysql 一看就会 基本语法

    创建表 create table <表名>( <字段名>  类型(长度) not null primary key auto_increment, **主键 name char ...

  9. Tomcat问题之 启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh

    在linux启动startup命令报Cannot find /usr/local/tomcat/bin/setclasspath.sh  使用: unset CATALINA_HOME命令得以解决   ...

  10. 07JavaScript数据类型

    JavaScript 数据类型 值类型(基本类型):字符串(String).数字(Number).布尔(Boolean).对空(Null).未定义(Undefined).Symbol. 引用数据类型: ...