CF1545D AquaMoon and Wrong Coordinate 题解
一年前做的题现在来补一发题解()。
思路:
首先题目很抽象,考虑形式化题面。
但这题确实容易摸不着头脑,可以先缩小问题考虑怎样确定某一行。
简单来说,我们需要构造一个多元哈希函数,使得:
-
任意两项交换后值不变。
-
可以判断是否各项均为等差数列。
考虑到交换律难搞,直接再缩小问题,考虑一个数的情况。
考虑性质二,如果我们要判断某项为等差数列,我们首先要确定该函数原来的值,然后比较。
已知多个点确定某位置的值,这让我们回想起拉格朗日插值。
$(n+1)$ 个点可以确定一个 $n$ 次多项式。
我们只需要令构造的函数是一个多项式即可,考虑到本来就有一个等差数列嵌套,可以直接选取 $f(x) = x$。
返回交换律那里,我们可以直接找一个有交换律的运算连接,为方便计算可以直接取和。
所以事实上,我们此时就是取了每行的和用于比较,这样即可确定某行。
回到原问题,如何确定某个数应被修改,与修改成多少。
这还是很难,考虑继续缩小问题,枚举每个该行的位置,转化为判定性问题。
(以下所有都建立在假设某个位置应修改的前提下)
似乎没思路了?理一理已知信息。
假设某个位置是应被修改的,此时我们知道:
-
该行其他位置正确的数,这也就导出了所有除它外的哈希值之和
-
通过其他行的哈希值确定的该行哈希函数原来的值,即该行哈希函数之和
这样我们其实已知了该位置的哈希值,这样即可确定该位置被修改成的值。
那么如何判定当前是否合法,这就回到了上一个问题。
复读并改动一下:
$(n+1)$ 个点可以确定一个 $n$ 次多项式。
我们只需要令构造的函数是一个多项式即可,考虑到本来就有一个等差数列嵌套,可以直接选取 $f(x) = x^2$。
实现:
后面可以预处理出不被修改的所有行的哈希值,降低复杂度。
这样就有一个时间复杂度 $O(n^2)$ 的做法。

浙公网安备 33010602011771号