题目大意:上菜很讲究,有些菜在前d分钟要上,有些菜则要在d分钟后才能上,还有些才要在某些菜上了之和才能上,最早什么时候上完n份菜?
蒜头君苦练厨艺,终于成为了某高档酒店的大厨。
每天上班,蒜头君会被要求做 份菜。既然是高档酒店,那么客人们当然是很讲究的,尤其对于上菜的时间有很多要求。客人们的要求被分成下列四种:
- 菜品 的上菜时间必须比菜品 的上菜时间早 分钟或者更早。
- 菜品 的上菜时间必须比菜品 的上菜时间迟 分钟或者更迟。
- 菜品 的上菜时间在 分钟以后(包含 分钟)。
- 菜品 的上菜时间在 分钟之前(包含 分钟)。
蒜头君的上班时间记为 分钟。为了节约时间,在满足客人们要求的情况下,蒜头君希望最后上的一道菜的时间尽可能的早。(每道菜的上菜时间必须不早于蒜头君的上班时间)
输入格式
第一行输入一个整数 ,表示一共需要上 道菜。
第二行输入一个整数 ,表示客人们的要求数量。
接下里 行,每行先输入一个整数 。
- 如果 ,表示描述里的第 种要求,后面跟着三个整数
- 如果 ,表示描述里的第 种要求,后面跟着三个整数
- 如果 ,表示描述里的第 种要求,后面跟着两个整数
- 如果 ,表示描述里的第 种要求,后面跟着两个整数
输出格式
如果蒜头君能满足客人们的要求,输出最后一道菜的上菜时间;否则输出一行 I can't
。
数据范围和约定
对于 的数据:,,。
对于 的数据:,并且输入保证有解。
对于 的数据:,,,。
样例解释 1
的上菜时间分别为 ,这样能满足输入客人们的所有要求,并且时间最短。
样例解释 2
,,合并以后得到 ,不可能满足客人们的所有要求。
样例输入1
3 5 2 3 2 10 2 2 1 2 2 3 2 5 1 2 3 7 3 3 9
样例输出1
12
样例输入2
3 4 3 1 3 2 3 1 9 2 1 3 -1 1 1 2 5
样例输出2
I can't
样例输入3
17 20 2 6 3 -21 1 8 2 54 3 7 -95 4 11 44 1 5 15 40 3 9 1 3 3 30 3 8 23 2 9 12 -15 4 13 61 2 3 7 31 1 5 10 -15 2 16 1 43 2 12 3 -79 2 14 16 -51 3 6 48 4 7 0 2 10 11 -59 2 12 17 -29 3 4 10
样例输出3
77
解题思路
第3、4条限制条件,分别指一道菜的最早上菜时间和最晚上菜时间,不难想到拓扑排序。a比b早c,则建立一条a指向b权值为c的有向边;a比b晚c,也就是b比a早c,即建立一条b指向a权值为c的有向边。建图后,拓扑排序,如果出现环就不可行?不是的!数据中有负数,虽然搞不清楚负数分钟的实际意义是什么,当出现了负数,就可以出现环了,只有不是正环就行。比如1比2早9,2比1早-10,这是有解的,0时刻上菜1,9时刻上菜2,这样两个条件都满足。
遇到可以出现环的“拓扑排序”怎么办?用差分约束系统,a比b早c,也就是b>=a+c,这样可以建立一条a指向b权值为c的有向边。其他条件也转化成大于等于的约束条件,这样我们就可以通过求最长路来满足所有约束条件。当然,你要全部转成小于等于再求最短路也行。(如果出现入队次数非常多,多到会超时,基本上就是出现正环/负环,即无解)
求最短路/最长路为什么能解决差分约束系统问题?以最长路为例,在求解过程中,如果出现不满足约束条件的情况,那么结点的路程就会更新、更大,继续影响其他点,直到不能再进行“松弛”操作,也就是所有条件都满足了。与普通SPFA相比,不同的是不是从某个起点开始,而且所有点都入队求解,这样才能让每个点都满足约束条件。