车人去 WC 了,找了一个巴蜀毕业的哈工大大三学生来给他代课。

那就简单记录一下每天都讲了什么吧

CF GYM103470 Paimon Segment Tree

给定一个长度为 nn 的序列 aa,以及 mm 次区间加操作和 qq 次询问(在处理完所有操作后再询问)。
询问操作:假设 ai,ja_{i,j} 表示进行完第 jj 次操作后 aia_i 的值。给定 lk,rk,xk,ykl_k,r_k,x_k,y_k 查询

i=lkrkj=xkykai,j2\sum^{r_k}_{i=lk}\sum^{y_k}_{j=x_k} a^2_{i,j}

显然可以想到的一步是,将询问离线下来差分第二个 \sum,就可以转化成求解历史区间平方和。

接着考虑如何维护,首先处理平方:

(a+k)2=(a2+2ak+k2)\sum (a+k)^2=\sum (a^2+2ak+k^2)

则只需维护区间的 0 次,1 次,2 次和与历史区间平方和。

构造一个矩阵 datadata

[lensumqsumhsum]\begin{bmatrix} len & sum & qsum & hsum \end{bmatrix}

对于区间加操作,相当于对区间的 datadata 乘上:

[1kk20012k000100001]\begin{bmatrix} 1 & k & k^2 & 0\\ 0 & 1 & 2k & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}

同时一次修改后,我们还要对整体用以下矩阵操作一次来累加 hsumhsum

[1000010000110001]\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 1 \end{bmatrix}

时间复杂度 O((m+q)logn×43)O((m+q)\log n\times4^3),需要卡常。

一个很智慧的应用是,我们可以自己模拟矩乘的过程来减少常数,当然你会发现这就变成了普通的维护 tagtag 的线段树。