维护后缀和的话,实际得到的是 [l−1,r) 的和。
但是我们想要 [l,r] 的和。
所以问题是询问 al−1=ar 的概率。
考虑用二维线段树维护二元组 (x,y) 不相等的概率。
考虑一个修改,它会对以下三种二元组分别产生贡献: 1. (x,y)(x∉[l,r],y∈[l,r])。 2. (x,y)(x∈[l,r],y∉[l,r])。 3. (x,y)(x,y∈[l,r])。
前两种会产生 1r−l+1 的贡献,后一种会产生 2r−l+1 的贡献。
注意,询问时若 l=1,询问的是前缀和与后缀和相等的概率,需要特别注意。
然后标记永久化,注意输出的时候把概率取反。
代码:
1 |
|