ARC136题解

这场 ARC 比较考验观察能力就是找到切入点的能力我会尽量在题解里给出一个观察的过程至于证明比猜到结论简单这场暴露出来我的容易进死胡同的问题也可能是人类本质就是一种思路做不出来的时候跳不出来思维僵化了以后训练中得注意对想不出来的题尝试跳出思维定势也可能只是 trick 掌握得不够导致跳出来也不知道想啥可以先多积累些思路毕竟思而不学则殆

C - Circular Addition

题面

收获的思路

  1. 在差分数组上看区间加减
  2. 问最小操作次数时找几个下界尝试证明其最大值可以取到证明时可以尝试把创造过程逆转为消除过程因为消除时的信息更多而创造是在创造信息

我看到了第一个切入点用差分数组处理区间加减问题如果您对这个题毫无头绪可以先对着这句话看自己能想到哪一步将目标数组看作环并作长为 $n$ 的差分数组发现这个差分数组和一定为 0而且每次操作一定是使得一个数 +1一个数 -1显然我们可以通过每次选择一正一负的一对位置操作来得到目标差分数组操作次数为差分数组中正值之和

然后我发现过不了最后一个样例仔细一看发现其实也没能给出前两个样例的具体操作步骤不太对劲具体来说就是可以交换差分数组上的操作顺序来获得额外的全体 +1buff这个信息在差分数组里被丢掉了从这时开始我就开始想着怎么最大化这个 buff以及是不是最大 buff 和零 buff 之间的所有值都能取到陷入了苦战

按照题解来讲的话我们已经观察到了一个操作次数下界还有另一个显然的下界就是数组中的最大值我们猜想他们中的最大值是可以被取到的然后反过来想将目标数组变为 0 的过程我们发现这个思路在近达上一场比赛 ARC135D 中就出现过需要学习一个

实际应用中这种猜想很可能会错尤其是难题所以姑且提出一个做题步骤

  1. 观察总结此前得到的事实提出猜想
  2. 代入样例若有误返回1
  3. 尝试证明若证伪返回1
  4. 如果证明或不会证而自信开码
  5. 如果没证出来且不太自信多造点样例再次手玩或对拍若有误返回1否则开码

按照步骤我们应当代入样例发现没问题开始尝试证明如果我们在每一时刻都能降低这一时刻的差分数组下界$L_1$最大值下界$L_2$中的最大值我们就构造性地证明了猜想的正确性为了降低最大者我们需要对$L_1$$L_2$的大小做出假设来进行进一步推理

  1. $L_1<L_2$此时数组中不可能有 0否则为了从 0 增加到 $L_2$差分数组中正值部分至少是 $L_2$这与 $L_1<L_2$ 矛盾于是全体 -1 即可这样能使 $L_2$ 减小 1
  2. $L_1>L_2$如果数组中有 0我们只要挑选一段包含最大值的极大非零区间来全体 -1这样能使 $L_1$ 减小 1如果数组中没有 0数组中一定有若干山谷所以一定可以找一段极大的连续最大值区间要求其左右不再是最大值来减 1这能使 $L_1$ 减小 1
  3. $L_1=L_2$如果数组中有 0一定是单调增加到 $L_2$ 再单调减小到 0将非零部分 -1 即可同时减小 $L_1$$L_2$如果数组中没有0数组中一定有若干山谷如果*极大的连续最大值区间*唯一那么将其减 1 即可否则一定可以找到一个区间覆盖所有的最大值例如除去最小值后获得的区间将这个区间全体减 1 即可

把这个过程反过来想会变得更难想尤其是 $L_1=L_2$ 时的操作所以这个减小双下限最大值的 trick 应该被加入知识库

D - Without Carry

题面

收获SOSdp

推荐博文SOSdpzeta transform 前者为后者前置知识本题只需要学习前者但是来都来了为什么不都学一下呢

读完博文直接就会做了不会就看官方题解不必多说

E - Non-coprime DAG

题面

收获我观察能力低下

  1. 不够耐心一条思路还没想透彻就放弃
  2. 可以把结论写出来更容易发现规律形式的不同会影响思考方式

在看题解之前您至少应该发现不可达互质并不等价例如9可以经12和14到达35并且经过了一定的思考

$i<j$ 考察 $i$ 是否可达 $j$ 后文同余符号皆模 2 $f(i)$$i$ 的最小质因子

  1. $i\equiv 0,\;j\equiv 0$此时一定可达
  2. $i\equiv 0,\;j\equiv 1$此时来到了第一个重要观察可以尝试经过 $j - f(j)$ 这一偶数到达 $j$ 所以不超过 $j-f(j)$ 的偶数都 ok 即要求$i\leq j-f(j)$而比它大的偶数$j$ 的差距已经小于其最小质因子了没有机会走到 $j$
  3. $i\equiv 1,\;j\equiv 0$类似于 2 要求$i+f(i)\leq j$
  4. $i\equiv 1,\; j\equiv 1$此时来到了第二个重要观察也是我卡住的地方由于我没有将上面的观察列出来我并没有注意经过偶数到达奇数这条路或者隐约觉得这效率低下其实这个类比还是比较明显的大脑好用时起码可以猜一个结论出来先写结论$i+f(i)\leq j-f(j)$ 即可首先两者都是奇数这就决定了只加一个一定为奇的质因数并不能使 $i$ 到达 $j$ 至少要加 2 个如果想由偶数搭桥显然i -> i+f(i) -> j-f(j) -> j的路径就是最优的如果不这样做要么 $i,j$ 有公因子此时 $i+f(i)\leq j-f(j)$ 必成立或者仍然可以理解为从偶数搭桥要么还是需要转到 $j-fac(j)$ 再转到 $j$ 其中 $fac(j)$$j$ 的某个因子而这一个转变最少也要加 $f(i)$ 转变后最少也要再加 $f(j)$ 到达 $j$ 本质还是从偶数搭桥

现在我们获得了可达的数学表达我又卡在这里了我去想 DAG 了并且没跳出来注意到不等号左右的内容都很相似并且右侧可以加1因为模2的限制两式仍然等价尝试总结为一个式子可以将不等式变形为

  1. $i+1\leq j$
  2. $i+1\leq j-f(j)+1$
  3. $i+f(i)\leq j$
  4. $i+f(i)\leq j-f(j)+1$

可以总结为

$i$ 可达 $j$ $\Leftrightarrow$ $up(i)\leq low(j)$其中 $up(i)=(i\equiv0)?i+1:i+f(i)$注意这个 $+1$ 这是因为 $i<j$ 不带等号$low(j)=(j\equiv0)?j:j-f(j)+1$

再次总结这个表达对任意的 $i, j$当且仅当 $up(i)\leq low(j)$$up(j)\leq low(i)$ 时他们之间可达用区间语言表达就更干净$[low(i), up(i))$$[low(j),up(j))$ 没有交点时可达注意区间开闭于是题目变成寻找有公共交点的区间族 $\{[low(i), up(i))\mid i\in\mathbb{N}\}$ 使得 $\sum_{i}A_i$最大随便做