Codeforces Round #754 (Div. 2) 题解(AE)

A. A.M. Deviation

首先,两个参数肯定是一个选\(a_1\)或者\(a_3\),一个是\(a_2\),不然\(a_1 + a_3 - 2 * a_2\)结果会不变。

先不考虑取绝对值,使用给定操作可以让\(a_1 + a_3 - 2 * a_2\)的值加减3。

取个模再分类讨论一下就完事了。

B. Reverse Sort

\(0\)的个数为\(cnt_0\),那么把前\(cnt_0\)个元素中的\(1\)和后\(n - cnt_0\)个元素中的\(0\)选出来排序,一次搞定。

记得特判不用排序的情况。

C. Dominant Character

首先,最终答案的开头和结尾必然是\(a\),是其他的只会更差。

然后,手动构造可以构造出满足条件且包含2个\(a\)和3个\(a\)的子串,例如\(aa\)\(abbacca\)

然后可以证明:一个子串如果包含\(4\)\(a\),那么它要么不满足条件,要么有一个更短的子串满足条件。这个结论我没有仔细证明,但是应该挺简单的。

现在,枚举每一个\(a\),看能不能和它前面最近的1个\(a\)组成满足条件的子串,再看能不能和它前面最近的2个\(a\)组成满足条件的子串,这样就完事了。

D. Treelabeling

挺有意思的构造。

首先,\(u \oplus v \le min(u,v)\) 可以推出\(u\)\(v\)的最高位相等,然后就可以按二进制的最高位将标号\(1-n\)分成\(log_2n\)组,最高位为\(i\)的记为第\(\text{label_group}_i\)对于边\((u, v)\),若\(u\)\(v\)属于不同组的话,则边\((u, v)\)不通。

然后看能不能通过重新标号构造出一个使得任意点都是先手必胜点的图,容易证明:所有边都不通的图是满足这个条件的,即图中任意相邻两点的最高位不一样

然后我想到了一个结论:一棵树一定是一个二分图。如果属于一个组的标号都在二分图一个分量中,那么就满足条件了。

先在原图上跑一下dfs染色得到二分图的两个分量,然后就看怎么分配标号的分组了。

取大小较小的一个分量,它的节点可以拆成多个\(2^i\)大小的组,大小为\(2^i\)的组刚好可以和\(\text{label_group}_i\)对应。

然后再把剩下的标号分配给另外一个分量的节点。

完事了。

E. Array Equalizer

这道题把自己演了,以为是数据结构,结果是思维+二分,果然想上分学二分就完事了。

首先,可以只考虑\(a_i\)\(b_i\)之间的差值,记为\(d_i\)。由于\(b_1\)的值未知,假设\(d_1\)\(x\)

然后,手算\(n\)较小的例子可以发现,每个位置操作的次数可以写成\(k_i \times x + d_i\)的形式,且通过转换可以使得\(k_i\)非负,因为由加和减两种操作。

最终的操作次数\(ans = \sum | k_i \times x + d_i |\),注意到\(k_i \times x + d_i, k_i \ge 0\)是一个单调递增的函数,将每个位置的操作按\(-\dfrac{d_i}{k_i}\)的大小排序,那么对于一个\(x\),可以将所有操作分为两个连续的部分,且每个部分\(k_i \times x + d_i\)的符号相同。这个二分一下就可以找到分割点了。

然后前缀和搞一搞就完事了。

写在最后

重回紫名了。

工作之后可以快乐刷题的时间好少,想研究一些自己感兴趣的技术也总是挤不出时间。现在有点后悔没有选轻松一点的公司了,至少不用每次等周五周六的场才能打,想写点东西想学点东西也不需要压缩睡眠。

感觉正在收获的额外的东西,却在透支着未来。

欸,好好打钱吧。

原文地址:https://www.cnblogs.com/zengzk/p/15547159.html