考虑不带修改怎么做。
令
fl,r,x,y 表示
[l,r] 区间内满足
i<j,ai=x,aj=y 的
(i,j) 数量,
tl,r,x 表示
[l,r] 区间内满足
ai=x 的
i 的数量。
假如你知道了
[l,mid] 区间和
(mid,r] 区间的
f 和
t 信息,显然有转移:
- tl,r,x=tl,mid,x+tmid+1,r,x
- fl,r,x,y=fl,mid,x,y+fmid+1,r,x,y+tl,mid,x⋅tmid+1,r,y。
然后就可以线段树维护了。
考虑
∀i∈[l,r],ai←vai 这个操作会对
fl,r,x,y 和
tl,r,x 造成什么影响。
令
fl,r,x,y′ 和
tl,r,x′ 表示修改后
f 和
t 的值,有:
- tl,r,x′=i∣vi=x∑tl,r,i。
- fl,r,x,y′=i,j∣vi=x,vj=y∑fl,r,i,j。
这样就可以维护修改了。
考虑区间修改怎么维护 lazytag。
你发现如果一个区间
[l,r] 的数先使
ai←xai 再使
ai←yai 等价于先使
xi←yxi 再使
ai←xai。
然后有了这个性质你就可以维护 lazytag 了。令
bi 为每次区间修改时的 lazytag,只需要让
bi←vbi 即可,
v 是原题面中的
S,T,U。下传同理。