Codeforces Round #670 (Div. 2)/Codeforces1406 ABCD

AC代码

A. Subset Mex

就先将集合中的数尽可能地用于增加\(mex(A)\),然后再尽可能地增加\(mex(B)\)

B. Maximum Product

先排个序,然后由于有可能负负得正,所以答案要么用最大的5个数,要么用最小的2个数和最大的3个数,要么用最小的4个数和最大的一个数。分别算然后取最大值即可。

先DFS找到树的所有重心。如果重心唯一,随便找条幸运的边删了再加就完事了。

否则,就有两个重心,记为\(c_1\)\(c_2\)。用反正法可以推出\(c_1\)\(c_2\)之间必定有一条边。然后从\(c_2\)的邻接表中随便选择一个非\(c_1\)的节点\(p\),可以证明这个节点必定存在。将边\((c_2,p)\)删除并加入边\((c_1,p)\)之后,\(c_1\)就会是唯一的重心。

D. Three Sequences

如果\(a_i > a_{i-1}\),那么\(b_i = b_{i-1} + a_i - a_{i-1}\)

如果\(a_i < a_{i-1}\),那么\(c_i = c_{i-1} + a_i - a_{i-1}\)

\(sum = \sum_{i=2}^n\max(0, a_i-a_{i-1})\),那么\(b_n = b_1 + sum = a_1- c_1+ sum\)

易得\(c_1 = \max{c_i}, b_n = \max{b_i}\),所以现在就只需要最小化\(\max(c_1, b_n)\),即最小化\(\max(c1, a_1 - c_1 + sum)\),而这个值可以推出就是\(\lceil \frac{a_1+sum}{2} \rceil\)

最后是区间加的问题,通过上面的分析,其实最重要的就是维护\(a\)的差分,然后原数组上的区间加对应到差分上就是两个端点的修改。

总结

30min过完前三题,看了下排名再70左右。然后卡D,推了个能过sample1的假结论,然后写了半天sample2过不去,人傻了。赛后看了jiangly的代码幡然醒悟。

posted @ 2020-09-13 13:06  _Backl1ght  阅读(242)  评论(0编辑  收藏  举报