莫队学习笔记
其实早该写了,但忘了
例题【模板】莫队 / 小B的询问
题意
一个长为 \(n\) 的,值域为 \([1,k]\) 的整数序列 \(a\)。
一共有 \(m\) 个询问,每个询问给定一个区间 \([l,r]\),求:
\[\sum\limits_{i=1}^k c_i^2
\]
其中 \(c_i\) 表示数字 \(i\) 在 \([l,r]\) 中的出现次数。
思路
1.我会暴力!
对于每个询问,暴力扫一遍,得到答案。
时间复杂度 \(O(n^2)\)
莫队
试想,假设对于区间 \([l,r]\),你已经维护了它的桶,现在你可以 \(O(1)\) 求出 \([l,r+1]\) 的桶吗?
非常简单,加上 \(a[r+1]\) 就完了。
于是我们可以对于某个询问,求出下一个询问。
但是炸了。如果我们每次查询都是最左最右轮流交替,那么他就被卡成 \(O(n^2)\) 的了。
于是聪明的毒瘤大佬们想到,可以让每个区间的左端点前分块后排序,即以左端点编号所在的块的编号为第一关键字,以右端点为第二关键字排序,这样就不会被卡了。
时间复杂度 \(O(n\sqrt{n})\)
恭喜你,已经学会了基础莫队!
剩下的先咕着

浙公网安备 33010602011771号