【学习笔记】[集训队互测 2018] 完美的队列

有点难

考虑暴力做法的本质

发现瓶颈在于找到所有的作用区间,观察性质发现作用的区间和之前队列中有多少元素是无关的

用分块优化之(类似于 大步小步),可以做到 O ( n n log ⁡ n ) O(n\sqrt{n}\log n) O(nn logn)

考虑优化掉 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 原来分块还有此妙用!之前没认真学分块可惜了。

据说这题还可以用线段树分治来做,但是我太菜了完全看不出来。

你可能感兴趣的:(学习,笔记,算法)