UOJ-NOI-Round-10-Day1A-麦田
题意
给出序列 \(a_{1, \ldots ,n}\),\(Q\) 次询问每次考虑 \(a_{l_i, \ldots ,r_i}\) 作为一个新序列。
每一次寻找序列所有 \(1<p<|a|\) 使得 \(a_{p-1}>a_p,a_{p+1}>a_p\) 然后同时将 \(a_p\) 变更为 \(\max(a_{p-1},a_{p+1})\),不断重复这个过程。求最终序列和。
\(n,q\le 10^6\)
思路
需要先考虑对于一个 \(a_p\) 它最终会变成什么。我们发现,如果这个位置左边的值 \(>a_p\),那么再左边的东西就不会对它有任何贡献了。然后,如果右边的小于 \(a_p\),那么它会被 \(a_{p-1}\) 在下一轮更新。那么我们发现,它会被:
- 左边的位置 \(L\) 使得 \(a_L>a_p\),\(a_{L+1}<a_{L+2}< \cdots <a_{p-1}<a_p\)
- 右边的位置 \(R\) 同理。
那么 \(a_p\) 当且仅当会被这两个位置的最大值更新,\(\Delta=\max(a_{L_p},a_{R_p})-a_p\)。所以这样就变成了一个二维数点问题,考虑所有的 \(l\le L_i\le R_i\le r\) 的位置加上贡献即可。
时间复杂度 \(\mathcal{O}\big((n+q)\log n\big)\)。还可以注意到 \(L_i,R_i\) 是递增的,所以可以直接前缀和 \(\mathcal{O}(n+q)\)。

浙公网安备 33010602011771号