题解 P9069【[Ynoi Easy Round 2022] 堕天作战】

$\text{Link}$

题意

区间不等于 $x$ 的减 $x$,区间求和。强制在线。

$n,q\le5\times10^5$,$0\le x,a_i\le 10^9$,时限 6s。

思路

一个不用倍增分块做到同复杂度的做法,当然倍增分块是更具有普适性的。

考虑一下问题,对于区间内小于 $x$ 的数,因为 $x\ge0$,其减完之后是小于 $0$ 的,之后每次一定都会被操作,可以直接全部取出,另外维护,取出用线段树维护一下最小值和最小值位置(任意)即可。

现在所有数都 $\ge x$,如果区间最小值大于 $x$ 则直接区间减。如果区间最小值等于 $x$,我们考虑再维护区间次小值,设为 $\text{sec}$。

如果 $\text{sec}-x>x$ 即 $\text{sec}>2x$,则大小关系不会变化,直接打上区间减 tag,维护两种 tag,一个是区间所有数减的 tag,一个是区间内非最小值被减了多少的 tag,再维护一下区间内最小值个数即可统计变化量。

如果 $\text{sec}-x\le x$ 即 $\text{sec}\le 2x$,减完后大小关系会发生改变,我们把区间内在 $(x,2x]$ 内的数取出来,这时转化为上面的情况,打完标记我们把被取出的数放回线段树中。维护次小值位置(任意)即可。

upd:这部分其实直接在 $\text{sec}-x\le x$ 的时候继续向两边递归即可。不用特意取出。时间复杂度是不变的。

令 $v=\max(a_i)$。每个数被取出必定会减半,即每个数只会被取出 $O(\log v)$ 次。时间复杂度为 $O(n\log n\log v)$。

需要代码请私信联系。

实现的代码吊打倍增分块,单点不超过 1s,直接最优解。

posted @ 2023-02-18 07:04  ffffyc  阅读(13)  评论(0)    收藏  举报  来源