P12417 基础构造练习题
念题解!
\(n\) 为奇数时是无解的。
考虑先假设所有数都是正整数。考虑数列中的最大值,要么只出现一次,要么出现偶数次,所以不可能让所有数都相等。
\(n=2^k\) 的构造很显然。做 \(k\) 轮,第 \(j\) 轮让 \((i,i+2^j)\) 做操作,经过 \(k\) 轮后所有值就相等了。
比如 \(n=4\) 时,先 \((1,2)(3,4)\),然后 \((1,3)(2,4)\)。
当 \(n\) 为偶数时,考虑怎么让 \(\underbrace{a,a,\cdots,a}_{n-2},b,b\) 变得相等。
一种想法是,构造等比数列,然后用首尾配对之类的方法凑相等。
比如说,先依次对所有 \(i \leq n-4\) 做 \((i,n-1)\) 操作。序列变成
然后
接下来,配一配对,全部变成 \(a^{n-3}b^2\) 即可。操作次数 \(O(n)\)。
如果直接用这个方法,每次加入两个数,复杂度是 \(T(n) = T(n-2)+O(n)\),即 \(O(n^2)\) 的。
这个做法看上去比较浪费。考虑类似 \(n=2^k\) 做法的分治:
当 \(4 \mid n\) 时直接分成两个 \(\frac{n}{2}\),两边分别做完后,对应位置合并。
当 \(4 \nmid n\) 时分成 \(\frac{n}{2}-1\) 和 \(\frac{n}{2}+1\),两边分别做完后,合并前 \(\frac{n}{2}-1\) 对,然后用上面的方法,加入两个数。
复杂度是 \(T(n) = 2T(n/2) + O(n) = O(n \log n)\)。
思考一下,加入两个数的构造,实际上是构造了等比数列,然后首尾拼接得到相同的值。
考虑沿用这里首尾拼接的思想。
因为 \(n = 2m\),所以可以先把序列变成相同的两部分,记为 \(a_1,a_2,\cdots,a_m\)。
设 \(p_i = \prod_{j=1}^i a_i\),\(s_i = \prod_{j=i}^m a_i\)。
然后沿用刚刚的方法。如果序列为 \(a_1,a_2,\cdots,a_m,b,b,b\),可以将其变成
以及,如果序列为 \(a_1,a_2,\cdots,a_m,c,c,c\),可以将其变成
然后配一下对,可以全部变成 \((bc\prod_{i=1}^m a_i)\)。
就做到线性了。
接下来就是简单卡常了。

浙公网安备 33010602011771号