对于一次询问,考虑有哪些可能的解。首先是一些特殊的答案:
ans=k,2p1+1,2prep1+1,其中
prei 为 最小的
aj 使得
aj≥i,这些都是可以快速判断的,先不考虑。
再就是答案肯定是
k 的一段前缀
+2j,其中
j∈/k。设答案取了
2p1∼2pi 和
2j(pi>j>pi+1),考虑这个
j 的取值可能是哪些。
-
如果这个
2j 是用一些
≤2pi+1 的
a 凑成的,那么肯定经过了这些
a 先加到
2pi+1+1 再不断进位到
2j,既然中间都存在到一个更小值的过程,那把
j 换成
pi+1+1 肯定更优,所以一种可能的取值是
2pi+1+1。
-
如果
2j 用了
>2pi+1 的
a 凑,那么这些
a 肯定不会
≤2pi+1,理由同上。那么肯定只用一个
a 最优,且这个
a 肯定是出现在
[pi+1+1,pi−1] 中最小的那个,证明和上面类似:如果取的不是最小那个,那么这个最小的用途肯定是去凑
≥2pi 的数了,中间肯定有个过程是变成了
2j,那把这个
2j 用一开始就存在的这个
2j 替换掉肯定更优。
所以只会存在最多
2m 种取值,设取值为
j 的答案为
ansj,容易发现
ans 是单调递增的。
考虑判定一个数 $x 能否被凑出来:
-
如果
x=2t,那么只考虑
≤t 的
ai,条件就是
∑2ai≥x。
-
如果
x=i=1∑k2bi(bi<bi+1),那么条件就是
∀i,j≤i∑2bj≤aj≤bi∑2aj,容易归纳证明。
把这个条件放到
ans 上去看,对于一个
2pi,右边的
aj≤pi∑2aj 已经知道了,又因为
ans 是单调的,所以如果处理出一个
posi 表示最大的
ansj 使得
ansj 的
i 后面位置的和
≤aj≤pi∑2aj,那么判断
ans 只需要对
posi 维护前缀
min 再额外判断一下
j 即可。
考虑咋处理这个
pos,先预处理一个
fi,gi 表示把
≤i 的
a 加起来(不进位到
i+1)得到的第
i 位的值和下一个
1 的位置。那么如果
fpi=0,
posi 就没救了,否则如果
>1 那么对于所有后缀都合法,令
posi=pi,
=1 可以讨论
gi 的值通过
posi+1 递推得到。
复杂度就是预处理
Θ(n+V),每次询问
Θ(m),总复杂度就是
Θ(n+V+∑m)。