题意
区间加,查询区间大于等于 \(k\) 的数的个数。
解析
这是一道数据结构题。
区间查询
这里贡献仍然独立。
考虑在每个块内维护有序序列,这样只需要一次二分即可计算块内贡献。
对于散块,暴力遍历即可。
若块大小为 \(B\),则复杂度为 \(O(\dfrac{n}{B}\log B+B)\)。
区间加
对于整块,块内的相对顺序不变,只需记录加法标记。注意考虑加法标记对二分比较的影响。
对于散块,需要重构有序序列,若加完后暴力排序,复杂度是 \(O(B\log B)\)。
在旧的有序序列中提取加和未被加的两部分,各是有序序列,归并即可做到 \(O(B)\)。
复杂度 \(O(\dfrac{n}{B}+B)\)。
令 \(B=\sqrt{n\log n}\) 得到最优复杂度 \(O(q\sqrt{n\log n})\)。
总结
复杂度分析技巧 : 分块的主要思想是平衡,若复杂度由两部分组成,直接令两者相等,即可解得最优块大小。
(本题数据非常弱,错误做法可能可以通过)