ARC135 简要题解
D
首先,能操作的位置有 \((n - 1)(m - 1)\) 个,同时我们知道左上角 \((n - 1)(m - 1)\) 个格子可以取到任意值,因此这个问题的解域就是一个 \((n - 1)(m - 1)\) 个变元的线性空间,理论上可以找到 \(n + m - 1\) 条线性无关的恒等式。
仔细观察可以发现,每次操作同一行或同一列要么没有一个格子被操作,否则被操作的两个格子必定相邻也即在改行或该列的奇偶性相反,于是可以得到操作后的矩阵 \(b\) 与原矩阵 \(a\) 的关系:
注意,对行的限制全部加起来和对列的限制全部加起来是线性相关的,因此这里就是 \(n + m - 1\) 条限制,充分性也很好证。
观察这个式子的实质,限定了每行每列的带权和为不变量,这里同一个元素在行列当中带权可能不同,为了简化可以将限制改为:
于是我们直接考虑令 \(a'_{i, j} = (-1) ^ {i + j}a_{i, j}\) 这样可以将带的权去除,限制转化为:
现在的问题就转化为求行列和为定值的 \(b\) 矩阵绝对值和的最小值,这样仍然不好做,继续转化:
维度分离,转化为对行列 \(n + m\) 个量的问题,一次性将最终的 \(b\) 填好,可以看作是对每行每列剩余值的使用,形式化得说:
每次选择行列两个量 \(i, j\),将 \(r_i, c_j\) 同时加上 \(d\),每次代价为 \(|d|\),问最终将 \(r, c\) 所有数变为 \(0\) 的最小代价,并构造方案。
这个问题可以很明显发现一个答案的下界:\(\max(\sum\limits_{i = 1} ^ n |r_i|, \sum\limits_{i = 1} ^ m |c_i|)\),事实上这个下界可以通过构造轻松得到:
不妨设 \(\sum\limits_{i = 1} ^ n |r_i| \le \sum\limits_{i = 1} ^ m |c_i|\),记 \(r\) 中正数和为 \(p_r\) 负数绝对值之和为 \(n_r\),类似地对 \(c\) 记 \(p_c, n_c\),根据假设:
我们先找到 \(r\) 中任意一个非负位置 \(p\),若不存在说明 \(p_c = p_r, n_c = n_r\) 直接跳过这部分。
将 \(c\) 中负的部分和 \(p\) 一起加直到 \(n_r = n'_c\) 此时定有 \(p'_r = p_c\),再将正负相应抵消即可,容易发现这达到了下界。
复杂度 \(\mathcal{O}(nm)\).
E
记 \(a_i = k_i \times i\),通过手玩容易发现,在不多次数后 \(k_i\) 为一个定值,通过打表这个位置大约为 \(\mathcal{O}(\sqrt{2n})\) 级别。
可以通过初等分析证明这个结论:考虑何时 \(k_{i + 1} = k_i\),需要满足:
容易得到 \(a_i\) 的一个上界:\(a_i \le x + \sum\limits_{j = 1} ^ i j - 1 = x + \frac{1}{2}(i - 1)i\),继而可以得到这个位置的一个上界:
通过简单化简即可得知 \(i \le \mathcal{O}(\sqrt{2n})\),但这个做法还不够优秀,考虑进一步优化。
观察打表后的 \(k\) 序列,容易发现其差分序列数值有很长一段相同且不增,于是可以猜测极长的相同段数量级不大,然后即可对通过不等式求出每段后自然数幂求和。
通过打表可以发现,相同段的数量级大约在 \(\mathcal{O}(2n ^ {\frac{1}{3}})\) 左右,就可以直接通过了。
再来通过初等分析证明这个结论:对与前 \(n ^ {\frac{1}{3}}\) 项,显然只有 \(n ^ {\frac{1}{3}}\) 个极长段,只用考虑后面项的段,注意此时 \(k_{n ^ {\frac{1}{3}}} \le n ^ {\frac{2}{3}}\).
假设后面存在 \(c\) 个极长的连续段,将每个连续段长度放缩为 \(1\),也一定有:
通过简单化简易知 \(c \le \sqrt{2}n ^ {\frac{1}{3}}\),于是证明了极长段的数量级,这个上界是极松的,可以轻松通过,复杂度 \(\mathcal{O}(Tn ^ {\frac{1}{3}})\).
F
这个问题初看不好下手,但发现序列长度是指数级下降的(每次变为 \(\frac{2}{3}n\)),这点非常有用。
从一个暴力开始入手,首先不难求得最终的序列长度 \(m\),记最终的序列为 \(b\),考虑如何确定 \(b_{0 \sim m - 1}\).
发现第 \(k\) 次操作的序列后的序列 \(x\),原本在 \(k - 1\) 次序列中的位置为 \(f(x) = \lfloor \frac{x}{2} \rfloor \times 3 + 1 + [x \equiv 1 \pmod 2]\).
因此 \(b_i = f ^ k(i)\),于是我们得到了一个 \(\mathcal{O}(mk)\) 的做法,注意到序列指数级下降,复杂度描述为 \(\mathcal{O}(nk\left(\frac{2}{3}\right) ^ k)\) 更为合适,当 \(k \ge 40\) 的时候,这个做法已经足够解决问题了,下面设计一个适合 \(k\) 较小的算法。
考察 \(f ^ k(x)\) 的性质,打表可以发现 \(f ^ k(x + 2 ^ k) = f ^ k(x) + 3 ^ k\),这表明 \(f ^ k(x)\) 在模 \(2 ^ k\) 意义下具有一定周期性。
证明:根据 \(k\) 从小到大归纳,\(k = 1\) 时显然有 \(f(x + 2) = f(x) + 3\),\(k > 1\) 时利用 \(f ^ k(x) = f(f ^ {k - 1}(x))\) 展开即可。
预处理 \(f ^ k(0 \sim 2 ^ k - 1)\),复杂度 \(\mathcal{O}(k2 ^ k)\),还需进一步优化。
考虑折半,取 \(a + b = k\),将 \(f ^ k(x)\) 视作 \(f ^ k(x) = f ^ a(f ^ b(x))\),原问题等价于求:
倍增预处理出 \(f_{i, j} = \sum\limits_k ^ {2 ^ j - 1} f ^ a(i + k \times 3 ^ b)(0 \le i \le 2 ^ a - 1)\),易得转移:
枚举 \(i \in [0, 2 ^ b - 1]\) 倍增计算求和即可,复杂度 \(\mathcal{O}((k + \log n)2 ^ {k / 2})\),总复杂度 \(\mathcal{O}(\min(nk\left(\frac{2}{3}\right) ^ k, (k + \log n)2 ^ {k / 2}))\).