Contest7506 - 莫队 分块
Published:
A 至少重复三次的数字
莫队板子。
B 小明的习题集
洛谷原题 P1494 [国家集训队] 小 Z 的袜子。
C 棋子的颜色
洛谷原题 P1903 [国家集训队] 数颜色 / 维护队列。
带修莫队:
普通莫队是二维问题,现在加上一维时间轴,做法基本上同普通莫队。
对询问 $(l,r,t)$ 排序时,第一关键字 $pos_l$,第二关键字 $pos_r$,第三关键字 $t$。
在时间轴上移动时,注意:
- 只有移动出现在 $[l,r]$ 才能造成贡献
- 执行过操作之后,要把操作改成撤回的样子
// u 是修改序列,q 是查询序列
void upd(int x /*当前查询操作的索引*/, int t /*当前时间*/) {
if (q[x].l <= u[t].x && u[t].x <= q[x].r) { // 在 [l, r] 内才有贡献
del(a[u[t].x]);
add(u[t].k);
}
swap(a[u[t].x], u[t].k); // 改造成撤回
}
时间复杂度
令各种东西同阶。
TODO: 一通分析
取块长 $B = \Theta(n^{\frac 2 3})$ 可得时间复杂度 $O(n^{\frac 5 3})$。
D 数列分块入门-1
LOJ 原题 #6277. 数列分块入门 1
简要题意:区间加、单点查询。
分块板子。
区间加:散块暴力,整块打加法标记,$O(\frac n B + B)$。
单点查询:直接查,$O(1)$。
令 $B \in \Theta(\sqrt n)$ 可得最优复杂度 $O(q \sqrt n)$。
E 数列分块入门-2
LOJ 原题 #6278. 数列分块入门 2
简要题意:区间加、区间查询 $\sum\limits_{i=l}^r [a_i < k]$($k$ 不固定,随询问给出)。
预处理:将每块内部排序。
区间查询:散块暴力,整块二分,$O(\frac {n \log B} B + B)$。
区间加:整块打加法标记,散块暴力后暴力重新整块排序,$O(\frac n B + B \log B)$。
令 $B \in \Theta(\sqrt n)$ 可得最优复杂度 $O(q \sqrt n \log n)$。
区间加精细一点:散块暴力后,没加的和加过的分别是两个有序序列,归并,$O(\frac n B + B)$。
令 $B \in \Theta(\sqrt {n \log n})$ 可得最优查询复杂度 $O(q \sqrt {n \log n})$。
据说可以用分散层叠进一步优化,但是我不会。。。
💡为什么取 $B \in \Theta(\sqrt {n \log n})$?
为了使时间复杂度最优,注意到区间加优于区间查询的复杂度,只要使得区间查询的 $O(\frac {n \log B} B + B)$ 最小。
即:
\[\frac {n \log B} B \approx B\](用 $f(n) \approx g(n)$ 代表 $f(n) \in \Theta(g(n))$)
注意到 $\log B \approx \log n$,因此:
\[\frac {n \log n} B \approx B\] \[B \approx \sqrt {n \log n}\]F 数列分块入门-3
LOJ 原题 #6279. 数列分块入门 3
简要题意:区间加、区间查询 $\max\limits_{l \le i \le r, a_i < k} a_i$($k$ 不固定,随询问给出),若答案不存在输出 $-1$。
借用上题做法即可,查询时间复杂度 $O(q \sqrt {n \log n})$。