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. OC 指向指针的指针

    #import <Foundation/Foundation.h> void changeC(char *d) { *d = ; } void changeStr(NSString **s ...

  2. AngularJS应用的启动和执行过程

    启动(startup): <!doctype html> <html ng-app> <head> <script src="http://code ...

  3. SSH2整合需要jar包解释

    hibernate3.jar, Hibernate的库,必须使用的jar包 antlr-2.7.6.jar, 语法分析生成器 语言转换工具,hibernate利用它实现HQL到SQL的转换 cglib ...

  4. Oracle创建自增序列

    Oracle没有自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 先建一个测试表了: create table userlogin( id   number(6 ...

  5. PHP 生成全局唯一id

    直接上代码: function generate_global_uniqid() { $prefix = md5(microtime(true)); // 生成唯一ID发生器 prefix,如果为服务 ...

  6. selenium基础知识(概述、安装、IDE等)

    参考http://www.yiibai.com/selenium/selenium_webdriver.html

  7. js中array(数组).map

    使用前 使用后 代码:

  8. DB2 编目并访问远程数据库

    之后将逐步对项目上的DB2相关经验做个总结,梳理一下知识结构. 要远程操作数据库,首先要进行编目,分三个步骤: 1. 在客户端建立服务器端数据库的节点,编目远程节点. 格式如下: 1. CATALOG ...

  9. LeetCode 中级 - 救生艇(105)

    第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. 返回载到每一个人所需的最小船数.(保证每个人都 ...

  10. 『ACM C++』 PTA 天梯赛练习集L1 | 038-039

    英剧总导演真的是忙哈哈哈,需要统筹兼顾所有方面,音频组.录音组.演员表演组.道具组.等等一系列的东西,当一个团队的Leader真不容易哈哈. ----------------------------- ...