2020ICPC昆明区域赛 M. Stone Games
链接
https://ac.nowcoder.com/acm/contest/12548/M
题意
设有正整数多重集 $S$,定义 $f(s)$ 为最小的不能由 $S$ 中若干个数(可以为 $0$ 个数)相加得到的非负整数(每个元素至多被用一次)。
给定长度为 $n$ $(n \le 1e6)$ 的正整数序列 $a_1,\dots,a_n$ $(1 \le a_i \le 1e9)$,$q$ $(q \le 1e5)$ 次询问一个区间 $[l,r]$,求 $f({a_l,\dots,a_r})$,强制在线。
思路
对于升序序列 $A$,定义 $S(i)=\sum_{j=1}^{i}{A_j}$,求最小的 $i$ 满足 $S(i)+1<A_{i+1}$,那么 $f(A)=S(i)+1$。
假设我们考虑到 $i$ ,此时可以得到的和为 $[0,S(i)]$:
- 若 $A_{i+1} \le S(i)+1$,那么现在可以得到 $[0,S(i)+A_{i+1}]$;
- 若 $A_{i+1} > S(i)+1$,无法得到 $S(i)+1$。
因此从 $i=0,s=0$ 开始考虑,求出 $\sum_{j=1}^{A_j\le s+1} A_j$,若 $s=\sum_{j=1}^{A_j\le s+1} A_j$,说明 $A_i$ 后的数都大于 $s+1$,那么 $s+1$ 就是答案,否则让 $s=\sum_{j=1}^{A_j\le s+1} A_j$。
用主席树维护,每次 $s$ 都会至少增加一倍,因此每次询问的时间复杂度是 $2$ 个 $\log$。
代码
1 |
|