复盘
T1 一眼不会。模拟样例的时候好像得到了一个对于每次询问 \(\mathcal O(n)\) 做的暴力算法。不太清楚。
画了点图。差不多得到一点想法。发现用 set 维护连通块,总复杂度 \(\mathcal O(n \log^2 n)\),1e6 肯定过不去。但应该能过 80。写写试试。
然后写了一坨。实际上这个时候思路还是很混乱的。
发现有一步不会写,随便蒙了个东西糊上去。显然假。但是数据似乎挺水应该能骗不少分。(这时还不知道捆绑测试。)
2.5h 了赶紧往后看题。
T2 送了 \(10\) 分。部分分好像是倍增。先写写试试 \(m=1\) 的。
没过手造样例。摆了不调了,或许做法是假的。
T3 什么玩意。
T4 送了 \(18\) 分。性质好像都不太会做。写吧。
\(0+0+0+18\)
总结
不足:
- T1 不会做。
- T2 调试没删。
- T2 部分分不会做。
- T4 性质不会做。
脑子跟被吃了一样,啥也不会。
知识点
T1:数学
T2:倍增
题解
A. 排序
令 \(f(i,j)\) 为 \(i,j\) 在二进制下最高的不同位。
在 \(a_i \ne a_{i+1}\) 的情况下,如果想让 \((a_i \oplus x) \le (a_{i+1} \oplus x)\),那么 \(x\) 的第 \(f(a_i,a_{i+1})\) 二进制位是唯一确定的。这取决于 \(a_i < a_{i+1}\) 还是 \(a_i > a_{i+1}\)。
所以判断矛盾就很好做了。
然后一次单调修改只会影响 \(\mathcal O(1)\) 个位置。这些位置重构即可。
真服了这么简单为啥想不到。真服了这么简单为啥想不到。真服了这么简单为啥想不到。
B. 交换
注意到对于 \(i_0=j,i_1=j+\operatorname{lcm}(n,m)\),有 \((b_{i_0 \bmod m}+i_0)\bmod n = (b_{i_1 \bmod m}+i_1)\bmod n\)。
也就是说每 \(\operatorname{lcm}(n,m)\) 次操作后,交换的两个数的位置是相同的。
所以求一个排列 \(p\) 表示第 \(i\) 个数经过 \(\operatorname{lcm}(n,m)\) 次操作后,\(a_i \gets a_{p_i}\)。用倍增让它跳 \(\lfloor t/\operatorname{lcm}(n,m) \rfloor\) 次。最后剩下的 \(\operatorname{lcm}(n,m)\) 次暴力。
这玩意就能过 \(60\) 分。
真服了这么简单为啥想不到。真服了这么简单为啥想不到。真服了这么简单为啥想不到。
考虑正解。
首先如果 \(m\) 是 \(n\) 的倍数那么跟上面做法一样。
考虑 \(m\) 不是 \(n\) 的倍数的情况。
——官方题解
注意力惊人的出题人。