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)\)上的点给贴到直线上。
但是原问题是整数,还有下取整。不过从实数问题推广到整数也并不是很难(由于是下取整,只会更优不会更差)。
所以问题就是给你一个曲线,你需要消掉上凸的部分,形成一个下凸壳,直接单调栈维护斜率即可。