4408: [Fjoi 2016]神秘数
Time Limit: 10 Sec
Memory Limit: 128 MB
Submit: 538
Solved: 331
[ Submit][ Status][ Discuss]
Description
一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数。例如S={1,1,1,4,13},
1 = 1
2 = 1+1
3 = 1+1+1
4 = 4
5 = 4+1
6 = 4+1+1
7 = 4+1+1+1
8无法表示为集合S的子集的和,故集合S的神秘数为8。
现给定n个正整数a[1]..a[n],m个询问,每次询问给定一个区间[l,r](l<=r),求由a[l],a[l+1],…,a[r]所构成的可重复数字集合的神秘数。
Input
第一行一个整数n,表示数字个数。
第二行n个整数,从1编号。
第三行一个整数m,表示询问个数。
以下m行,每行一对整数l,r,表示一个询问。
Output
Sample Input
5
1 2 4 9 10
5
1 1
1 2
1 3
1 4
1 5
Sample Output
2
4
8
8
8
HINT
对于100%的数据点,n,m <= 100000,∑a[i] <= 10^9
Source
[ Submit][ Status][ Discuss]
题解:主席树
假设我们有一串有序(从小到大)的数,前i个数可以达到的范围是[1,x],那么如果第i+1个数是y,设y<=x+1,那么我可以得到新的范围是[1,x+y];如果y>x+1,那么x+1是无论如何都取不到的,我们就找到了答案。
那么这是个暴力的思路,如何在O(nlogn) 的时间求解呢?
区间内的数有序->离散化+线段树的下标表示权值的大小。
还要求区间的有序数前缀和->主席树
#include
#include
#include
#include
#include
#include