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

由于修改是前缀修改,且不会改变前缀01的数量,所以不妨从末尾开始修改。

然后就模拟一下完事了。

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))\)

posted @ 2021-04-04 15:24  _Backl1ght  阅读(149)  评论(0编辑  收藏  举报