AtCoder Regular Contest 135 题解

A

最终拆分得到的数是若干个 \(3\) 和若干个 \(2\) ,用 map 模拟拆分的过程即可。

B

考虑将 \(a_1,a_2\) 看作主元。那么发现,

  • 如果 \(i\equiv 1\pmod{3}\),那么 \(a_i=a_1+c_i\)
  • 如果 \(i\equiv 2\pmod{3}\),那么 \(a_i=a_2+c_i\)
  • 如果 \(i\equiv 0\pmod{3}\),那么 \(a_i=c_i-a_1-a_2\)

其中 \(c_i=a_{i-2}-c_{i-1}-c_{i-2}(i\ge 3),c_1=c_2=0\)

又因为 \(a_i\ge 0\),我们乱搞搞即可可以得到形如 \(a_1\ge X,a_2\ge Y,a_1+a_2\le Z\) 的式子,由此可以得出一组合法的 \(\{a_i\}\)

C

\(B_i=A_i\oplus A_1\),那么可以发现能够得到的序列中第一个元素只有以下几种可能:

  • \(A_1\)
  • \(B_2,B_3,\cdots,B_n\)

记这个集合为 \(S\),那么题目等价于求 \(\max\limits_{x\in S}\sum\limits_{i=1}^nB_i\oplus x\),直接无脑建出 \(B_i\) 的 trie 树后在上面瞎 dfs 即可。

然后才发现 wssb,只用记录下 \(B_i\) 中每一位上 \(1\) 的个数,这样可以 \(\mathcal O(\log V)\) 地对每一个 \(x\) 计算 \(\sum\) 里的值。

D

一道我不是太擅长的转化 + 贪心。

u1s1 我整场比赛就败在这道题上了,过完 C 后我花了整整 20 分钟思考这道题却毫无头绪,丢了 D 开了 E 后才发现 E 比 D 可做许多,到后来会了 E 却没来得及调了 /ll/ll

记最终得到的序列为 \(B\),令 \(X_{i,j}=A_{i,j}·(-1)^{i+j}\)​,\(Y_{i,j}=B_{i,j}·(-1)^{i+j}\)。那么可以发现,一个矩阵 \(B\) 能够被得到的必要条件是 \(\forall i\)\(X\) 矩阵第 \(i\) 行的和等于 \(Y\) 矩阵第 \(i\) 行的和;\(\forall j\)\(X\) 矩阵第 \(j\) 列的和等于 \(Y\) 矩阵第 \(j\) 列的和。同时也不难证明其是充分条件:每一次通过 \(n-1\) 次操作将 \(X,Y\) 第一列上的值变得相同,然后归纳下去即可。

也就是说题目转化为,给定一个矩阵 \(A\),我们要求出令一个矩阵 \(B\),满足 \(\forall i\)\(A\)\(i\) 行上所有元素之和等于 \(B\) 的第 \(i\) 行上所有元素之和,\(\forall j\)\(A\)\(j\) 列上所有元素之和等于 \(B\) 的第 \(j\) 列上所有元素之和。我们将这个过程倒过来,记 \(x_i\) 表示 \(A\) 矩阵第 \(i\) 行的元素和,\(y_j\) 表示 \(B\) 矩阵第 \(j\) 列的元素和,那么每次操作等价于,选择一个 \((i,j,V)\),令 \(x_i\leftarrow x_i-V,y_j\leftarrow y_j-V,Y_{i,j}\leftarrow Y_{i,j}+V,ans\leftarrow ans+|V|\)。要使得最终 \(x_i=y_j=0\)\(ans\) 最小。

不难发现答案下界是 \(\max(\sum\limits_{i=1}^n|x_i|,\sum\limits_{j=1}^m|y_j|)\)。考虑这样构造达到这个下界:

  • 首先,每次选择一组 \(x_i>0,y_j>0\)\((i,j)\),然后执行操作 \((i,j,\min(x_i,y_j))\),或者选择一组 \(x_i<0,y_j<0\)\((i,j)\),然后执行操作 \((i,j,\max(x_i,y_j))\)。、
  • 如果找不到这样的 \(i,j\),那么意味着 \(x,y\) 之一已经被情况,不妨假设 \(y\) 已经被清空,此时我们再找出一对 \(i_1,i_2\) 使得 \(x_{i_1}>0,x_{i_2}<0\),然后执行 \((i_1,1,\min(x_{i_1},-x_{i_2})),(i_2,1,-\min(x_{i_1},-x_{i_2}))\)​ 即可。

可以发现通过上述构造,答案刚好达到下界 \(\max(\sum\limits_{i=1}^n|x_i|,\sum\limits_{j=1}^m|y_j|)\)

时间复杂度 \(\Theta(n^2)\),如果将 \(n,m\) 视作同阶。

E

u1s1 这个 E 真的比 D 可做!!!!111

首先暴力求解答案非常容易:每次找到 \(>a_i\) 且为 \(i+1\) 的倍数的最小数作为 \(a_{i+1}\)

注意到这样一个性质,就是当 \(i\) 大概达到 \(\sqrt{X}\) 时,\(a_i=a_{i-1}=a_{i+2}-a_i\),也就是说 \(a_i\)\(\sqrt{X}\) 附近的某个位置之后是一个等差数列。

这样我们就得到了一个 \(\sqrt{X}\)​ 的做法,对小于这一阈值的部分暴力,大于这一阈值的部分等差数列求和,想法很好,唯一的不足是过不去(

考虑优化,直觉告诉我们,当 \(i\) 达到一个小于 \(\sqrt{X}\) 的临界值时,\(\dfrac{a_i}{i}\) 也开始成等差数列——更具体地,是一段一段等差数列。我赛时打了个表,发现当 \(X=10^{18}\) 时,\([1,2\times 10^6]\) 中,\(\dfrac{a_i}{i}\) 的等差数列段数大概是 \(116\times 10^4\),但 \([1,10^8]\) 中,\(\dfrac{a_i}{i}\) 的等差数列段数只增长到了 \(117\times 10^4\),这意味着 \(2\times 10^6\) 后面这一部分等差数列段数是很少的,因此直接暴力找等差数列即可,找等差数列可以二分右端点,然后判是否前一项都大于后一项即可,这容易 \(\mathcal O(1)\) 判断。事实上,官方题解证明了等差数列段数是 \(X^{1/3}\) 的,有兴趣可以研究官方题解(

为什么赛时没调出来 /fn/fn/fn

F

太难了,日后有时间再慢慢研究。

posted @ 2022-02-14 14:32  tzc_wk  阅读(264)  评论(3)    收藏  举报