ABC461E

In Luogu

比较板的 ds 题。

考虑操作 \(1\),横着涂一行黑的会改变什么。如果是第一次涂这一行,贡献显然就是 \(n\)。但是如果不是呢?不妨记上一次涂这一行的时刻为 \(j\),当前时刻为 \(i\)。那么时刻 \(j \sim i\) 中有多少列被涂白了,这一次操作就会把它们变成黑的。贡献就是这个列数。

那么问题转化为求时刻 \(j \sim i\) 中,有多少列被涂白了,注意要去重。操作 \(2\) 的贡献也是同理的。\(j\) 是很好维护的,维护第 \(p\) 行,第 \(q\) 列上一次涂的时间 \(r_{p},c_{q}\) 即可。那么可以把询问序列离线下来然后扫描线用树状数组算。

不过这样太麻烦了。考虑一个更聪明的做法。我们已经维护了 \(r_p,c_q\),那么时刻 $j\sim i $ 中,有多少列被涂白了实际上就是求有多少个 \(c_q > r_p\),那么树状数组容易维护。时间复杂度 \(O(q\log n)\)

Record

posted @ 2026-06-07 12:41  RainyRadio  阅读(7)  评论(0)    收藏  举报