专栏文章

题解:P11930 [PA 2025] 吃树叶 / Liście

P11930题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipsxbfh
此快照首次捕获于
2025/12/03 17:25
3 个月前
此快照最后确认于
2025/12/03 17:25
3 个月前
查看原文
因为时限太搞笑所以暴力分块可以过。但是怎么没人说复杂度对的做法啊。
操作是维护 bb 序列,支持前缀加,查询前缀内 aia_i 大于等于 xx 的位置 bib_i 的和。
操作强于行加列求和,显然得根号。暴力的单根号很简单,看其他题解吧。考虑 nmz1016nmz\leq 10^{16} 怎么用,我们希望能编一个 O(nmz)\mathcal O(\sqrt{nmz}) 的东西出来。
操作分块,每 BB修改操作分一块。这样一共会分成 m/Bm/B 块。处理到第 ii 块的时候,需要计算 [1,i1][1,i-1] 的块对这之中的询问的贡献,以及第 ii 块内部的修改对询问的贡献。

[1,i1][1,i-1] 块的贡献

计算出 fjf_j 表示处理了 [1,i1][1,i-1] 的块内的所有修改,此时 jj 的权值,这部分复杂度是 O(nm/B)\mathcal O(nm/B)。查询就是一个二维数点。
总的修改次数是 O(nm/B)\mathcal O(nm/B) 级别的,而查询数只有 zz。考虑平衡一下复杂度。
因为 zz 也是 10610^6,常规分块复杂度还是有点高。所以可以分三层的块:设 T=100T=100,每 TT 个位置分一个小块,这样一共有 10410^4 个小块。然后每 TT 个小块建立一个大块。维护每个点的值,小块内部的和,和大块内部的和,修改是 O(1)\mathcal O(1),查询 O(T)\mathcal O(T)

块内的贡献

一个修改操作 (pi,wi)(p_i,w_i) 对一个查询操作 (qj,dj)(q_j,d_j) 的贡献是 [1,min(pi,qj)][1,\min(p_i,q_j)] 内,aa 大于等于 djd_j 的点数 ×wi\times w_i,也就是 zBzB 次数点,总点数是 nn。这部分也是和上面一样的三层分块,只不过维护的是块内前缀和,大块内的小块前缀和,大块前缀和。修改 O(T)\mathcal O(T),查询 O(1)\mathcal O(1)
总复杂度是 O(nm/B+zT+zB+nT)\mathcal O(nm/B+zT+zB+nT),取 B=nm/zB=\sqrt{nm/z} 可以得到复杂度是 O(nmz+(n+z)T)\mathcal O(\sqrt{nmz}+(n+z)T)

评论

0 条评论,欢迎与作者交流。

正在加载评论...