Log Trick 是一种观察,可以通过发现具有一些性质的元素最多有 个来降低复杂度。常见的例子有:

  • 有单调性的区间按位操作,比如按位与/按位或。当区间扩大时,不同的结果值最多有 个。
  • 区间 。当区间扩大时,不同的结果值最多有 个。

例子

例子:CF1632D - New Year Concert

给定一个长度为 的数组 ,定义一次操作为修改任意一个数组中的元素。对于一个长度为 的数组 ,定义 为使得对于所有的 ,都有 的最少操作次数。现在,请求出 的值。

数据范围:

对于每个点 ,我们用一个数组 存放一些点对 ,其中 表示满足 的最大的下标 。由于 之间至少相差 倍,所以不同的 至多有 个,亦即 最多有 个元素。

我们从左到右遍历数组。对于每个元素,遍历 数组并找出不符合题目要求的点,也就是说存在某个 到下一个 之间有点 使得 恰好等于 的情况。每次遇到这种情况,我们就直接贪心地把 改成一个和数组中的其他元素都不同的质数。并且题目不要求输出修改后的序列,所以实际上不需要修改,只需要把 清空,只留下一个点对 即可。

时间复杂度是 是值域。有两个 的原因是计算 的复杂度也是