F - Cumulative Cumulative Cumulative Sum Editorial by potato167


遅延セグメントtreeを使って解きます。

まず、 Dx=i=1xCx=i=1x(x+1i)BxD_{x}=\sum_{i=1}^{x}C_{x}=\sum_{i=1}^{x}(x+1-i)B_{x} です。

ここで、 El,r=i=lr1(ri)BiE_{l,r}=\sum_{i=l}^{r-1}(r-i)B_{i} さらに、Fl,r=i=lr1BiF_{l,r}=\sum_{i=l}^{r-1}B_{i} と定義します。

Dx=E1,(x+1)D_{x}=E_{1,(x+1)} となるため、この El,rE_{l,r} を求めることができれば良いです。

ここで、 El,k,Ek,r,Fl,k,Fk,r(lkr)E_{l,k},E_{k,r},F_{l,k},F_{k,r} (l\leq k\leq r) がわかっているとき、以下が成り立ちます。

  • El,r=El,k+Ek,r+(rk)Fl,kE_{l,r}=E_{l,k}+E_{k,r}+(r-k)F_{l,k}

  • Fl,r=Fl,k+Fk,rF_{l,r}=F_{l,k}+F_{k,r}

また、i=l,l+1,...r2,r1i=l,l+1,...r-2,r-1 に対して Bi+=difB_{i}+=dif をすると、El,r,Fl,rE_{l,r}, F_{l,r} は以下のように変化します。

  • El,r+=dif(rl)(rl+1)2E_{l,r}+=dif\frac{(r-l)(r-l+1)}{2}

  • Fl,r+=(rl)difF_{l,r}+=(r-l)dif

AxvA_{x}\leftarrow v というクエリは、dif=vAxdif=v-A_{x} とおくことで、 i=x,x+1,...Ni=x,x+1,...N に対して Bi+=difB_{i}+=dif とするクエリと置き換えることができるので、(El,r,Fl,r,rl)(E_{l,r},F_{l,r},r-l) をノードにもつ遅延セグメントtreeを使用することで、二つのクエリを一つ当たり O(logN)O(\log N) で処理することができます。

実装例

posted:
last update:



2025-04-08 (Tue)
11:08:43 +00:00