ARC 130 整场题解

ARC 130 整场题解

全部代码链接

A - Remove One Character

删去的必然是一个连续段里的字符。

B - Colorful Lines

如果硬是要维护每一个颜色的连通块情况就比较麻烦了。

我比赛的时候的想法是将操作\(i\)的颜色看作二元组\((c_i,i)\)这样每一个颜色就不同了。

最终统计答案就是计算\(\sum_{j\in [1,q]} cnt(c,j)\)的值。

用一个\(map\)从后往前做即可。

C - Digit Sum Minimization

一个比较繁琐的构造题。

容易发现最终的目标是让发生进位的地方尽可能多。

因为每一次进位,都会让数位和\(-9\)

所以最优的答案一定是个位和\(\geq10\),前面搞出尽量多的pair,使得和\(\geq9\)

容易想到网络流,显然是没有必要的。

只需要贪心地选择,每次选择最小的\(\geq9\)的即可。

D - Zigzag Tree

常规计数题。

首先考虑黑白染色,原问题等价于所有黑点的邻居都\(<\)它。

由于将\(p_i\)变成\(n-p_i+1\)仍然满足条件,所以只需要计算上面那个情况,然后\(\times2\)就是答案。

\(dp_{u,v}\)表示\(u\)在子树\(u\)中排名是\(v\)

转移用一个前缀和优化即可。

E - Increasing Minimum

正着做会让一个数是否是最小值变得比较难以维护。

考虑倒着做,\(+\)变成\(-\),能被\(-1\)的集合一定不会增元素,求新问题的最小字典序和原问题等价。

倒序维护两个集合\(A,B\)

\(A\)为最小值集合。\(B\)为最小值\(+1\)的集合。

每次操作\(i_j\)必然属于\(A\)或者\(B\)

  • 属于\(A\),则\([A,B]\leftarrow[\{i_j\},A\text{\\}i_j]\)

  • 否则,\([A,B]\leftarrow[A\cup i_j,B\text{\\}i_j]\)

事实上如果确定初始的\(A,B\)则最终序列确定,可以发现最优解满足\(A\cup B=\{1,2,3...n\}\)

考虑另一种理解,在一个柜子上相邻两层放了物体(柜子层数无限),每次可以将上层移动到下层,如果后面不会再移动就把这个物品扔掉。

这样这题就不是那么困难了。

F - Replace by Average

考虑操作的本质是什么?

将原数列化成曲线,存在点\((i,a_i)\)

操作\(l,r\)就是将直线\((l,r)\)上的点给贴到直线上。

但是原问题是整数,还有下取整。不过从实数问题推广到整数也并不是很难(由于是下取整,只会更优不会更差)。

所以问题就是给你一个曲线,你需要消掉上凸的部分,形成一个下凸壳,直接单调栈维护斜率即可。

posted @ 2021-11-30 23:58  WWW~~~  阅读(299)  评论(0编辑  收藏  举报