CF1562D2题解

首先这个题的 \(a_1-a_2+a_3\cdots\) 可以把偶数位的正负号反转一下,这样就变成求和了。

反转好之后记为 \(b_i=(-1)^{i-1}a_i\)

前缀和一下。

对于每个询问三种情况:

\(d=\sum\limits_{i=l}^rb_i\)

  1. \(d=0\),输出 \(0\)
  2. \(d \bmod 2=1\)

接下来证明一次操作必然可行。

假设 \(d\) 是正数。

\(c_k=\sum\limits_{i=l}^kb_i\)

那么有 \(|c_i-c_{i-1}|=1~(l<i\le r )\)

假设我们删掉的位置是 \(k\)

那么新的权值就是 \(c_{k-1}-(c_r-c_k)\)

如果 \(b_k=1\)

则要满足 \(2c_k-1=c_r=d\)

显然当 \(b_i=1\)\(c_i\) 可以取遍 \([0,d]\) 之间的整数,并且 \(d\) 是正整数,有 \(\dfrac{d+1}2\le d\)

那么我们必然能找到一个 \(k\) 满足 \(b_k=1\)\(c_k = \dfrac{d+1}2\)

\(d\) 是负数也是类似做法。

所以一次操作一定可行。

具体的实现方法:每个 \(c\) 的值开个桶 \(s_j\)\(c_i=j\)\(i\)

然后每次查询的时候直接二分 \(\ge l\) 的最小值。

  1. \(d\bmod 2=0\)

这个也很简单,首先根据奇偶性,一次操作完之后权值是奇数,肯定不行。

那么先把最后一个符号删掉,然后就转换成了情况 \(2\)

这样两次操作就做完了。

代码太丑了,挂个 CF 链接吧。

CF1562D2题解

上一篇:docker-compose命令


下一篇:docker 基础操作