【arc072e】AtCoder Regular Contest 072 E

题意

给定一个D,以及一个长度为N的序列a,顺序执行这些数字:
对于一个数字x,会使得D=min(D,abs(D-x))

有Q次询问,每次询问独立,给出i,能否修改a[i],使得D最后不为0.

n,q<=500000

解法

我们设Low[i],表示当前D执行i+1..n的数字之后,不为0的最小值。

我们知道,对于每一次询问i,
求出前i-1个数字执行后的结果D,
通过修改a[i],我们可以使得D变成[1,D],

那么如果D>=Low[i+1]就回答"YES",否则回答"NO"。

现在问题变成了怎样求出Low数组,

[边界:Low[n+1]=1, Low[i]=Low[i+1]+a[i]*(a[i]<2*Low[i+1])]

当a[i]<2*Low[i+1]时,这次的数字操作有效,
为了走到Low[i+1],所以Low[i]要加上a[i].

原文地址:https://www.cnblogs.com/hiweibolu/p/8487821.html