hdu 3854

由于a_i 不变 容易想到将值<K的点都看成死点去掉 那么 原序列就被切分成若干小段 题目变成 求跨段的0-1对数+有死点参与时的01对数

仅考虑跨段对数的话 设去掉死点后的0有sa个 1有sb 个 每段有a[i]个0, b[i] 个1 那么跨段对数=

sa*sb-SUM(a[i]*b[i])

假设0操作将第k段的某个01位反转了,a[k]->a[k]+da,b[k]->b[k]-da

于是跨段对数变成(sa+da)*(sb-db)-SUM(a[i]*b[i] ,i!=k) -(a[k]+da)*(b[k]-da)

=   sa*sb-SUM(a[i]*b[i])  +  da*( sb-sa+a[k]-b[k])

于是得到增量为da*( sb-sa+a[k]-b[k])  通过初始化出第一个答案 然后维护a[],b[],sa,sb就可以直接得到跨段对数

再加上死点的对数。 设死点有z0个0,z1个1 那么 死点的对数有z0*z1+z0*zb+z1*za (注意这个也要维护)

posted on 2011-08-25 15:41  宇宙吾心  阅读(156)  评论(0)    收藏  举报

导航