专栏文章

题解:P6526 「Wdoi-1」四重存在

P6526题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqdo303
此快照首次捕获于
2025/12/04 03:06
3 个月前
此快照最后确认于
2025/12/04 03:06
3 个月前
查看原文
题解区有两篇线段树做法的题解,复杂度 O(mlogm)O(m \log m)。还有一篇线性做法的题解,但我好像没怎么看懂,于是自己写了一个和那篇题解不太一样的其他线性做法。
f(i)f(i) 表示 ii 是后一个点时的最大值,g(i)g(i) 表示此时前一个点的编号,f(i)f'(i) 表示 ii 是后一个点时的非严格次大值。
考虑插入一个点时如何快速处理 f,g,ff, g, f' 三个数组。曼哈顿距离不好处理,考虑转成切比雪夫距离。然后我们实时维护八个点代表 x,yx, y 方向上的最大 / 次大 / 最小 / 次小值,利用这些信息可以在 O(1)O(1) 时间内快速处理出 f,g,ff, g, f' 三个数组。
对于 22 询问,显然问的是 ff 的全局最大值,直接维护即可,接下来考虑如何处理 33 询问。
显然对于某次询问,如果此时有 nn 个点,询问时删除了第 xx 号点,显然答案应该是:
max(maxi=1x1f(i),maxi=x+1nf(i),maxi=x+1nf(i)×[g(i)x])\max(\max_{i = 1}^{x - 1} f(i), \max_{i = x + 1}^n f'(i), \max_{i = x + 1}^n f(i) \times [g(i) \neq x])
为什么次大值 ff' 那里不需要考虑是从哪个点转移来的?因为如果次大值是从 xx 转移来的,那么最大值一定不是从 xx 来的。最大值严格不小于次大值,所以就算统计了非法的次大值也不会对答案产生影响。
第一部分可以直接处理前缀和 O(1)O(1) 查询。但实际上我们不需要维护前缀和查询第一部分,这一部分我们可以一会儿扔到第三部分一起做。
第二部分看起来是个查询后缀和,但我们注意到因为 f(i)f(i)f'(i) \le f(i),因此就算把 maxi=1x1f(i)\max_{i = 1}^{x - 1} f'(i) 统计进来也不会对答案产生影响。所以其实第二部分就是:
max(maxi=1x1f(i),maxi=x+1nf(i))\max(\max_{i = 1}^{x - 1} f'(i), \max_{i = x + 1}^n f'(i))
换言之,就是查询整个 ff' 序列除了 xx 位置的最大值。
我们维护 ff' 序列的最大值,最大值的位置和次大值即可 O(1)O(1) 查询。
现在难的是第三部分,如何 O(1)O(1) 查询?
注意到第一部分的 maxi=1x1f(i)\max_{i = 1}^{x - 1} f(i),由于 xx 前面的所有数 gg 都不可能是 xx,所以在后面乘上 [g(i)x][g(i) \neq x] 也不会影响。
那么第一部分和第三部分可以合起来,长这样:
max(maxi=1x1f(i)×[g(i)x],maxi=x+1nf(i)×[g(i)x])\max(\max_{i = 1}^{x - 1} f(i) \times [g(i) \neq x], \max_{i = x + 1}^n f(i) \times [g(i) \neq x])
其实这就是:
maxi=1nf(i)×[ix]×[g(i)x]\max_{i = 1}^n f(i) \times [i \neq x] \times [g(i) \neq x]
这个东西怎么处理?
处理出 ff 的最大值,假设这个最大值为 f(i)f(i)。找到 g(j)ig(j) \neq i 的最大 f(j)f(j)kg(i)k \neq g(i)g(k)g(i)g(k) \neq g(i) 的最大 f(k)f(k)。当 x=ix = i 时答案为 f(j)f(j),当 x=g(i)x = g(i) 时答案为 f(k)f(k),其他情况下答案为 f(i)f(i),回答询问是 O(1)O(1) 的。
并且我们发现在插入一个新 f,gf, g 的时候我们可以 O(1)O(1) 更新 f(i),f(j)f(i), f(j)f(k)f(k)。具体做法如下:
设插入的数为 yy
  • f(y)>f(i)f(y) > f(i)
    • g(y)=ig(y) = i
      • g(k)=ig(k) = i,则 f(k)f(j),f(j)f(i),f(i)f(y)f(k) \leftarrow f(j), f(j) \leftarrow f(i), f(i) \leftarrow f(y)
      • 反之,若 g(k)ig(k) \neq i,则 f(k)max(f(j),f(k)),f(j)f(i),f(i)f(y)f(k) \leftarrow \max(f(j), f(k)), f(j) \leftarrow f(i), f(i) \leftarrow f(y)
    • 反之,若 g(y)ig(y) \neq i,但 g(y)=g(i)g(y) = g(i)
      • g(j)=g(i)g(j) = g(i)j=g(i)j = g(i),则 f(k)f(k) 不变,f(j)f(i),f(i)f(y)f(j) \leftarrow f(i), f(i) \leftarrow f(y)
      • 反之,则 f(k)max(f(j),f(k)),f(j)f(i),f(i)f(y)f(k) \leftarrow \max(f(j), f(k)), f(j) \leftarrow f(i), f(i) \leftarrow f(y)
    • 反之,则 f(k)f(i),f(j)f(i),f(i)f(y)f(k) \leftarrow f(i), f(j) \leftarrow f(i), f(i) \leftarrow f(y)
  • 否则则判断能否用 f(y)f(y) 更新 f(j)f(j)f(k)f(k) 即可。
显然这些东西都是 O(1)O(1) 的。
每一步操作都是 O(1)O(1) 的,总复杂度自然是 O(n)O(n) 的。
于是我们得到了一个线性做法,跑得还是飞快的,截至目前还是本题最优解来着。

评论

1 条评论,欢迎与作者交流。

正在加载评论...