Loading

CF1545D AquaMoon and Wrong Coordinate 题解

一年前做的题现在来补一发题解()。

思路:

首先题目很抽象,考虑形式化题面

但这题确实容易摸不着头脑,可以先缩小问题考虑怎样确定某一行。

简单来说,我们需要构造一个多元哈希函数,使得:

  • 任意两项交换后值不变。

  • 可以判断是否各项均为等差数列。

考虑到交换律难搞,直接再缩小问题,考虑一个数的情况。

考虑性质二,如果我们要判断某项为等差数列,我们首先要确定该函数原来的值,然后比较。

已知多个点确定某位置的值,这让我们回想起拉格朗日插值。

$(n+1)$ 个点可以确定一个 $n$ 次多项式。

我们只需要令构造的函数是一个多项式即可,考虑到本来就有一个等差数列嵌套,可以直接选取 $f(x) = x$。

返回交换律那里,我们可以直接找一个有交换律的运算连接,为方便计算可以直接取和。

所以事实上,我们此时就是取了每行的和用于比较,这样即可确定某行。

回到原问题,如何确定某个数应被修改,与修改成多少。

这还是很难,考虑继续缩小问题,枚举每个该行的位置,转化为判定性问题。

(以下所有都建立在假设某个位置应修改的前提下)

似乎没思路了?理一理已知信息。

假设某个位置是应被修改的,此时我们知道:

  • 该行其他位置正确的数,这也就导出了所有除它外的哈希值之和

  • 通过其他行的哈希值确定的该行哈希函数原来的值,即该行哈希函数之和

这样我们其实已知了该位置的哈希值,这样即可确定该位置被修改成的值。

那么如何判定当前是否合法,这就回到了上一个问题。

复读并改动一下:

$(n+1)$ 个点可以确定一个 $n$ 次多项式。

我们只需要令构造的函数是一个多项式即可,考虑到本来就有一个等差数列嵌套,可以直接选取 $f(x) = x^2$。

实现:

后面可以预处理出不被修改的所有行的哈希值,降低复杂度。

这样就有一个时间复杂度 $O(n^2)$ 的做法。

posted @ 2023-09-11 08:44  hsaht2426  阅读(12)  评论(0)    收藏  举报  来源