hdu 3854

由于a_i 不变 容易想到将值

仅考虑跨段对数的话 设去掉死点后的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 (注意这个也要维护)

转载于:https://www.cnblogs.com/zhaozhe/archive/2011/08/25/2153409.html

你可能感兴趣的:(hdu 3854)