[ACwing4316] 合适数对
合适数对
原题再现
给定数列\(A:\){\(a_n\)},\(s.t. \forall i\in(0,n],a_i\in \mathbb{Z}\),给定\(t\in\mathbb{Z}^+\),求存在多少组数对\((x,y)\),满足\(t < \sum_{i=x}^ya_i\).
其中,\(n\in[1,2\times10^5],|a_i|\in(0,10^9),|t|\in[0,10^9)\)
考场思路
考虑前缀和,设\(B_i=\sum_{j=1}^ia_j\),原命题转化成
\[\sum_{y\in[1,n],x\in[1,y)} [B_y - B_{x-1} > t]
\]
然后就已知在考虑数据结构优化,最终还是没有想出来...
正解
考虑平衡树/树状数组
本质:动态维护每个数的排名
我们知道将(1)式转化一下,变为
\[\sum_{y\in[1,n],x\in[1,y)}[B_y>B_{x-1}+t]
\]
我们只需将\(B_i\)依次加入平衡树,每次考虑\(B_y\)的排名即可,这个用平衡树很好实现.
也可以用树状数组...

浙公网安备 33010602011771号