P8146 [JRKSJ R4] risrqnis
有点有趣。 Orzcyf!
发现序列分块后块内只需要维护 01 序列,支持区间覆盖以及区间和。
然而区间覆盖我没有什么好做法。
值域 \([l,r]\) 覆盖,序列 \([l,r]\) 查。
有什么好做法吗。。。
想不到,想不到啊。
\(m=1\) 的做法是简单的,考虑排序后维护未加入的点即可,即若干连续段。考虑每个点只会加入一次,复杂度显然正确。可以用并查集、set、线段树二分之类。
其他的话考虑离线每个集合的操作,然后考虑将用 ODT 将值域区间推平转为值域区间加,然后我们再用一个序列分块,考虑维护下加的操作,那么在序列分块的同时我们只需要维护序列 \([bl,br]\) 的数的是否被覆盖,既然已经将值域转为操作了,发现需要维护块内 \([L,R]\) 值域的 未覆盖的个数,值域 DS 维护即可。
事实上本题比较值得学习的是后面这个做法,即转化为序列分块,那么如何确定不会重复推平?ODT。那么考虑此次值域加对本块的贡献,再考虑完整询问本块的序列区间查。
代码倒是回家写。
事实上是可以根号分治的,但大体 hard 的部分也是在后面。