主席树.
考虑如何计算一个集合的 $\text{Forbidden Sum}$ .
将集合内的数从小到大排序,依次加入.若当前可以表示出 $[0,s]$ 内的所有数,再加入一个数 $x$ .
若 $x\le s+1$ ,则可以表示出 $[0,s+x]$ 内的所有数.若 $x> s+1$ ,则 $s+1$ 无法被表示出,答案为 $s+1$ .
实际做的时候可以换一种思路,将枚举 $x$ 变为不断更新 $s$ .
初始令 $s=1$ ,每次在区间 $[l,r]$ 内询问所有 $\le s$ 的数之和,即上面分析的前缀和.若询问到的 $x<s$ ,则答案为 $s$ .
否则令 $s=x+1$ ,继续询问.
询问一段区间内 $\le s$ 的所有数之和可以用主席树实现.
考虑时间复杂度,若每次都 $x\ge s$ ,每次询问 $s$ 至少翻一倍,所以在主席树上查询了 $O(\log \sum a_i)$ 次.
总时间复杂度为 $O(m\cdot \log \max a_i\cdot \log \sum a_i)$ .
1 |
|