题意解析:给定一个长度为 nnn 的数组 AAA。你需要进行 qqq 次操作,操作共有两种:
* 操作 1:给定 l,r,kl,r,kl,r,k,将 AAA 中 [l,r][l,r][l,r] 的值增加 kkk。
* 操作 2:给定 l,rl,rl,r,求 ∑j=lrAj\sum_{j=l}^r A_j∑j=lr Aj 。
你说得对,但是我不会离线,也不会线段树树状数组等复杂数据结构。
所以我只能从暴力出发,看看能不能解决。
注意到暴力有两种做法:
1. 开一个前缀和数组,对于操作 1,枚举 j∈[l,r]j\in [l,r]j∈[l,r],将 AjA_jAj 的值增加 kkk,然后从头更新前缀和数组;对于操作 2,暴力查询前缀和数组即可。操作 1 O(n)O(n)O(n),操作 2 O(1)O(1)O(1)。
2. 开一个前缀和数组,不做修改,另开一个数组额外记录下每次操作的信息。对于操作 111,直接将信息加入到操作数组内即可;对于操作 2,先查询前缀和数组,然后枚举之前的操作,看看对这个区间做了多少贡献。操作 1 O(1)O(1)O(1),操作 2 O(q)O(q)O(q)。
我们发现,这两种做法好像可以合并。
我们可以在第二种做法的基础上,定时清空之前的操作。具体做法就是
再开一个差分数组。对于操作 1,在差分数组的 lll 处 +k+k+k,r+1r+1r+1 处 −k-k−k;每隔 BBB 次操作,通过差分数组 O(n)O(n)O(n) 重新计算出 AAA 以及前缀和数组,并清空操作数组。这样操作 2 的时间复杂度就降为 O(B)O(B)O(B) 了。
总时间复杂度就是 O(nqB+qB)O(\frac{nq}{B}+qB)O(Bnq +qB),当 BBB 取 n\sqrt nn 时,总时间复杂度为 O(qn)O(q\sqrt n)O(qn )。