题意
俗话说,deadline 是第一生产力,对于小 U 也是如此。之前忙碌的数学集训和考试让他无暇顾及OI,几天前他才接到了出题任务:给联考出题。
“我一个 MOer,怎么来给联考出题了呢?” 他感叹道。
小 U 一共有 n n n 个出题任务,其中某些出题任务的类型是不一样的。比如想 idea 属于脑力型劳动,写 std 属于体力型劳动。我们用 t i t_i ti 表示第 i i i 个任务的类型,其中 t i = 0 t_i = 0 ti=0 表示脑力型劳动, t i = 1 t_i = 1 ti=1 表示体力型劳动。
小 U 决定把数学集训完毕的时间到比赛开始的时间分成 m m m 个部分,而每一部分时间小 U 只能完成恰好一个出题任务。若数对 ( u , v ) (u, v) (u,v) 满足:在第 v v v 部分时间他可以做第 u u u 个任务,那么则称数对 ( u , v ) (u, v) (u,v) 是合适的 。小 U 有 k k k 个合适的数对 ( u i , v i ) ( 1 ≤ i ≤ k ) (u_i, vi) (1 \le i \le k) (ui,vi)(1≤i≤k)。
为了肝 ddl,小 U 决定采取以下两步策略:
- (1)决定每一部分的时间是做体力型劳动还是脑力型劳动。
- (2)在满足 1 的要求之下,每一个部分的时间选取一个能够做的任务 (要求任务类型与 (1) 中决定的类型相同) 完成。当然,如果没有能够做的任务,他只能在这一部分时间里什么都不做。
由于小 U 很擅长计算,但是他不擅长做选择。所以他实行第 (2) 步策略时,总是可以在 (1) 的约束下找到一种策略使得最终被做完的出题任务数量最大。但是他实行第 (1) 步策略往往不是最优的,很可能是最劣的。
幸运的小 U 在实行第 (1) 步策略时没有做出太差的决定,所以他最后把所有出题任务都几乎做完了。但还是差一些任务没有做完,怎么办呢?小 U 灵机一动,决定把这个题出在联测里:
假设小 U 第 (1) 步做出了最不利于第 (2) 步的决定,那么他能够做完几个出题任务呢?
对于所有数据, 1 ≤ n ≤ 2000 , 1 ≤ m ≤ 2000 , 1 ≤ k ≤ 5000 1 \le n \le 2000,1 \le m \le 2000,1 \le k \le 5000 1≤n≤2000,1≤m≤2000,1≤k≤5000。
数据编号 | n ≤ n \le n≤ | m ≤ m \le m≤ | k ≤ k \le k≤ | 特殊限制 |
---|---|---|---|---|
1 | 2 2 2 | 2 2 2 | 2 2 2 | 无 |
2,3 | 10 10 10 | 10 10 10 | 100 100 100 | 无 |
4,5 | 20 20 20 | 15 15 15 | 30 30 30 | 无 |
6-8 | 2000 2000 2000 | 2000 2000 2000 | 5000 5000 5000 | 特殊性质一 |
9-15 | 2000 2000 2000 | 2000 2000 2000 | 5000 5000 5000 | 特殊性质二 |
16-25 | 2000 2000 2000 | 2000 2000 2000 | 5000 5000 5000 | 无 |
特殊性质一:对于任意 1 ≤ i ≤ n , t i = 0 1 \le i \le n ,t_i = 0 1≤i≤n,ti=0 。
特殊性质二:每一部分时间都有恰好两种可以完成的任务,并且这两种任务类型不同
题解
对于特殊性质二,把任务按种类看作二分图,每个时间向对应的两个任务连边,要求的就是最小点覆盖。
由此考虑扩展到一般情况,就是要确定每个时间连向的种类,使得最小点覆盖最小。由于边不确定不好直接求最小点覆盖,而要求的是最小值,联想到最小割,考虑把覆盖一个点看作一个1的割。这样,把每个时间段拆点,起点向终点连1的边(构造一个1的割),把0和1的任务分别和S、T连边,这样可以把时间段归到哪边看作这个时间段选了哪个种类。由于每条边的两个端点至少要选一个(即至少有一个点产生割),于是把每个时间的起点、终点分别和0,1的任务连inf的边,这样可以保证每条边的两个点至少有一个产生割,对整张图求最小割即可。