Codeforces Round #712 (Div. 2) 题解A-E
A. Déjà Vu
根据回文串的定义,对于字符串\(s_{1 \dots n}\),只要存在\(s_{i} \ne s_{n - i + 1}\),那么\(s\)就不是回文串。
遍历\(s\),若存在非a
的字符,那么在对应位置插入a
就可以。反之,则无解。
B. Flip the Bits
由于修改是前缀修改,且不会改变前缀0
和1
的数量,所以不妨从末尾开始修改。
然后就模拟一下完事了。
C. Balance the Bits
观察1:若有可行解,则0
有偶数个。
证明:
将(
看成\(-1\),将)
看成\(1\)。若一个括号串是平衡的,那么其所有的前缀和非负,且整个串的和为\(0\)。
记\(a\)和\(b\)的和分别为\(sa\)和\(sb\),\(\Delta = sa - sb\)。
对于\(s_i = 1\)的位置,其对\(\Delta\)无贡献;对于\(s_i = 0\)的位置,其对\(\Delta\)的贡献为\(+2\)或\(-2\)。
由于最后\(sa = sb = 0\),所以最后\(\Delta = 0\)。
那么对于每一个\(+2\),必须要有一个\(-2\)将其抵消。
观察2:对于\(s_i = 1\),前一半填(
,后一半填)
。
因为要防止前缀和非负,所以前面尽可能提高前缀和应该是最优的。
观察3:对于\(s_i = 0\),交替填。
理由同上。
D. 3-Coloring
假设没有禁手,那么其实可以只用两种颜色将棋盘染色,例如国际象棋棋盘。
现在有禁手,其实也可以先用两种颜色去染。
假定现在计划用1染色的格子已经染完了,而计划用2染色的格子还没染完。此时如果禁手2,那么就凉凉了。第三种颜色就是用于这种情况。此时只需要用3去染原本计划用2染色的格子即可。
然后分类讨论一下就可以了。
禁手1就用2填2或者用3填1。
禁手2就用1填1或者同3填2。
禁手3就1和2选一个填。
证明:
这样其实就是将3视为1和2种的一种。
因为若1和2都染完了,就结束了。所以一局游戏里只会将3视为1和2中的一种,即3不会冲突。
因为原本就保证了1和2不冲突,此时又可以证明3不冲突,所以可行。
E. Travelling Salesman Problem
因为\(c_i\)是必须的花费,不妨先将其花掉。现在从\(i\)城到\(j\)城的花费为\(\max(0, a_j - a_i - c_i)\)。
此时,从\(a\)大的城市到\(a\)小的城市是免费的。
其实从那个城市出发都是一样的,因为最后的路径是一个环,修改起点并不影响总的代价。所以不妨将城市按\(a\)升序排序。
由于从\(a\)大的城市到\(a\)小的城市是免费的,那么如果到达了\(a_n\),之后的路就都是免费的了。
现在的目标就是从\(a_1\)走到\(a_n\),那么\(a_1\)到\(a_n\)的最短路径就是答案。
此时可以建个图跑Dijkstra,但是其实有更简单的方法。
将从\(a_1\)到\(a_n\)的过程视为攀登,那么其实可以将\(a\)视为高度,\(c\)视为梯子。对于每一个城市,到达\(a_j\)的最优方法就是从\(\arg \max_{i < j} a_i + c_i\)爬到\(a_j\)。对应的代价为\(\sum_{j = 2}^{n} \max(0, a_j - \max_{i < j}(a_i + c_i))\)。