BUPT 2022 Summer Training #2
链接:https://vjudge.net/contest/502701
A - Circuits
题意
给一堆边和坐标轴平行的矩形,问用两条水平直线最多能贯穿多少矩形。其中同时被两条直线贯穿的矩形只算一次。
思路
首先,这个问题可以转化为一维,即一堆线段和两个点的问题。
然后我们考虑枚举一个点,求另外一个点的做法。
假设坐标较小的点为A,较大的点为B。那么我们先离散化,然后从1到上限枚举A的位置,先不管B的存在,直接求有多少线段与A有交,这个问题显然可以用线段树解决。
考虑B的问题。对B来说,左边界小于等于A的线段如果和B有交也没用,不需要重复计算;左边界大于等于A的线段如果和B有交那么一定有用。那么我们可以将所有线段按左边界从右往左排序,将线段逐个往线段树里加,同时预处理出back[i]所有左边界大于等于i的线段能产生的最大贡献。
最后再从头到尾遍历一遍,取ask(i)+back[i+1]的最大值即可。
B - Cosmetic Survey O
题意
提取出题目的核心内容就是给定一张有向图,定义一条路径的值为这条路径上的边权最小值,定义两个点之间的强度为两个点所有路径的值的最大值,求所有点两两之间的强度。(n≤500)
我们的愚蠢思路
枚举起点,维护一个能从起点到达的点的集合S,然后边权从大到小加边,如果加到一条从S中的点指向非S中的点的边,那么被指向的那条非S中的点以及所有能由这个点到达的非S中的点的强度都为这条边的权值(同时当然要把这些点加到S里)。
英明的简单思路
其实一个flyod就可以了。求两点的最短路径换个说法,就是定义一条路径的值为这条路径上的边权的和,求两个点之间的路径的值的最小值。把“边权的和”替换成“边权的最小值”,”路径的值的最小值”替换成“路径的值的最大值”就是本题了。
D - Go Latin O
略
E - LED
题意
坐标平面上一堆点,让你构造一个三段阶梯函数,使得所有点到函数曲线的纵向距离的最大值最小。
思路
先二分答案,然后按x坐标从小到大遍历所有点,如果能放到当前阶段就加入,否则就跳到下一阶段。如果到某个点时第三个阶段都不合法那么说明不成立,否则成立。
F - Parentheses
题意
Dennis觉得C语言不够优秀,于是发明了ICPC语言。在ICPC语言中,算式的每一步运算必须加上括号(除了最后一步)。比如(a+b)+c。现在给你一个算式,显然有且仅有以下三种情况:
error:这个算式在C语言下会报错。
improper:这个算式在C语言下不会报错,但在ICPC语言中不够正确。
proper:这个算式在ICPC语言中也是正确的。
给你一个算式,让你判断它属于那种情况。
思路
没啥思路,就是硬模拟。写一堆if语句,就完事了。
J - Starwars Ø
题意
有向图中有一些点为人类点,一些点为军营,边有边权,要求判断是否存在两条边权序列相同的路径,起点分别为人类点和非人类点,而终点均为军营点(不必相同)。
思路
把两条路径上的两个点作为一个二元组放在一起搜索。搜索的起点是一个点为人类点一个点为非人类点的二元组,终点为两个点都为军营的二元组。如果a->c和b->d的边权相同,那么(a,b)就可以转移到(c,d),用dfs或bfs均可。
然而实际上这是有可能被特殊构造的数据卡掉的。
K - TV Show Game
题意
一串灯,每个可能是R或B(红色或蓝色)。现在有n个人,每个人都对某三个灯有颜色上的判断。现在问你是否存在一个灯的颜色的构造,使得每个人的判断中都至少有两个是正确的。如果是就输出构造,否则输出-1.
思路
变异2-sat问题。连边方法为:假设某人的判断为A-R,B-R,C-R(其它颜色类似)。那么应该连:
A-B -> B-R , A-B -> C-R
B-B -> A-R , B-B -> C-R
C-B -> A-R , C-B -> B-R
连完之后跑一边2-sat板子即可。
L - Working Plan O
题意
有n天m个人,每个人在要工作时必须连续工作恰好w天,然后休息至少h天。现在给定每天的工作人数和每人的工作天数,求是否有满足要求的安排方式,如果有输出方案。
思路
每个人的工作天数显然要是w的倍数,工作天数除以w后就是每个人要工作的块数。
接下来贪心即可。某一天如果发现人手不够,那么优先选择剩余工作块数多的人,因为这样能保证还能工作的人尽可能多,而同样的剩余工作块数分散在多人身上必然不会比集中在一人身上差。
因此把人放在一个优先队列里维护,剩余工作块数多的优先,休息完之后再加回到优先队列里。

浙公网安备 33010602011771号