P7560 [JOISC 2021] フードコート (Day1)
这道题有个逆天 trick,并且很常用,但是我看诸多题解都没有提到这一点。在 AT 的部分题目中也用到了这一点。
第一个想法就是换维扫描线,对着时间维度做显然不太可靠,想要处理区间尾接信息简直了,例如 PKUSC/WC 的某个题也是这样的做法,一般遇到这种不太能做的问题而且询问还是单点询问/形式比较好的区间询问就考虑换维扫描线。
OK,我们从 \(1\) 号点扫描到 \(n\) 号点,我们假设扫到 \(i\) 时我们维护出了一个按照时间顺序排布的操作序列,我们考虑前两种操作在干什么:
- 增加 \(k\) 个元素,那么就接在尾部。
- 删除 \(k\) 个元素,如果存在 \(> k\) 个元素,就删去前面的部分,否则全删,假设某次查询操作前面删除了 \(p\) 个数,那么查询可以看作不删除但是 \(b = b + p\),这样就规避了删除操作。
为了方便,我们不维护具体删了多少个数,维护最后剩下部分的长度是多少,因为增加元素数量是可控的,这样会比原来形式要好一些。
现在问题就是,如何维护每次进行删除操作过后的长度,这个东西会对 \(0\) 取 \(\max\),一个非常妙的 trick 是,你往每次增加后面也对 \(0\) 取个 \(\max\),这样操作就变成了维护后缀最大子段和,那么只需要先 \(+k, -k\),然后再让最后的值减去前面前缀和最小的一个值即可。
然后查询的时候新开一个时间轴线段树二分即可。

浙公网安备 33010602011771号