[CF]Round514

A Cashier

题意:一个人,一天的工作时长为(L),从第(t_i)时刻开始有长度为(l_i)的工作,他想在工作间隙抽烟,抽一根要(a)分钟,问能抽几根。

直接模拟。

B Forgery

题意:给定一个由#.构成的矩阵,问能否用一个3*3但是中间是空的由#构成的“画笔”可以重叠的画出这个图形。

其实也是模拟,就是把给定的图中能涂的笔画全都涂上,然后比较生成的图和给定的图有何不同就行了。

C Sequence Transformation

题意:给定一个(1..n)的序列,定义变换为:将该序列中的所有数的(gcd)放入答案序列中,然后删除一个数。求字典序最大的答案序列。

由于要字典序最大,所以要尽可能早的构造出一个非(1)(gcd),可以想到,最好构造的(删除的数最少的)(gcd)就是(2)(只用删除一半的数),然后就出现了一个规模更小的形式相同的问题:构造(2,4,6,8,..)的最大的答案序列。递归进行这个步骤就行了。注意只剩(3)个元素的时候,样例给出了更好的解决方案(1,1,3)。

D Nature Reserve

题意:给定一些平面上的点,问能否用一个与(x)轴相切的圆把它们包起来,如果能,输出最小的半径。

容易发现,如果这些点的纵坐标有正有负或有多个在(y)轴上,那就不可能有一个满足条件的圆。设圆心为((x, y)),容易发现半径就是(y),那么有((x-x_i)^2 + (y-y_i)^2 le y^2),化简可得:(x_i - sqrt{y_i*(2y-y_i)} le x le x_i + sqrt{y_i*(2y-y_i)}),由于两侧的界是单调的,所以可以二分(y),看是否有满足条件的(x)

注意二分的上界是很高的,对于这样一组点((10^7, 10^7), (-10^7, 10^7), (10^7, 1), (-10^7, 1)),半径的长度高达(5cdot 10^{13})的级别。所以二分上界要尽可能的高一些。这样的复杂度是(O(nlog C)),其中(C)是二分上界。

这个题还有许多其他做法,比如在二分(y)之后,看以每个点为圆心,(y)为半径的的圆和直线(y = y)的交点判断是否有解。据说还有(O(n log n))的做法。

E Split the Tree

题意:给定一棵有根树,点有点权,问最少能用几根点数不超过(L)的,总点权不超过(S)的,直上直下的链不相交地覆盖这个树。

可以DP也可以贪心。首先预处理出每个点向上能走多远(倍增),然后对于某个点,我们可以贪心的选择儿子中的能跑的更远的点来扩展到这个点。

原文地址:https://www.cnblogs.com/wyxwyx/p/cfr514.html