有点难
考虑暴力做法的本质
发现瓶颈在于找到所有的作用区间,观察性质发现作用的区间和之前队列中有多少元素是无关的
用分块优化之(类似于 大步小步),可以做到 O ( n n log n ) O(n\sqrt{n}\log n) O(nnlogn)
考虑优化掉 log \log log
发现对于一段相同的区间,其对应的 e d i ed_i edi(即作用区间的右端点)是单调的,因此可以考虑将每个 [ l , r ] [l,r] [l,r]拆分成若干个整块和至多 2 2 2个散块,然后对所有块取 max \max max就能得到 e d i ed_i edi
对于整块,用双指针暴力移动之,如果仍用线段树来维护那么复杂度不变;但是发现对于整块的修改可以直接打标记,而每个修改至多拆分成两个散块,因此均摊正确;
对于散块,考虑拆分成 单个队列,发现指针的单次移动为 O ( 1 ) O(1) O(1),因此复杂度正确;
总复杂度 O ( n n ) O(n\sqrt{n}) O(nn)。
remark \text{remark} remark 原来分块还有此妙用!之前没认真学分块可惜了。
据说这题还可以用线段树分治来做,但是我太菜了完全看不出来。