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 (注意这个也要维护)
浙公网安备 33010602011771号