【BZOJ4299】Codechef FRBSUM
2016-03-09 10:44
127 查看
Description
数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数。
例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2(S’={1,1}),3(S’={3}),4(S’={1,3}),5(S’ = {1, 1, 3}),但是它无法得到6。因此S的ForbiddenSum为6。
给定一个序列A,你的任务是回答该数列的一些子区间所形成的数集的ForbiddenSum是多少。
Input
输入数据的第一行包含一个整数N,表示序列的长度。
接下来一行包含N个数,表示给定的序列A(从1标号)。
接下来一行包含一个整数M,表示询问的组数。
接下来M行,每行一对整数,表示一组询问。
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%的数据,1≤N,M≤100000,1≤A_i≤10^9,1≤A_1+A_2+…+A_N≤10^9。
Source
By yts1999
如果当前集合的子集和可以拼凑出[0,i]的所有数,那么也可以拼凑出[1,不大于i+1的所有数的和]
可以考虑倍增查询.
先从1开始,查所有比1小的数的和,
把和+1后继续查询,直到最后答案不再变化.
用主席树维护一下就行了.
讲道理是应该离散的,但是我看见有人没写离散就过了..所以就没写离散
看来数据实在是辣鸡..
数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数。
例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2(S’={1,1}),3(S’={3}),4(S’={1,3}),5(S’ = {1, 1, 3}),但是它无法得到6。因此S的ForbiddenSum为6。
给定一个序列A,你的任务是回答该数列的一些子区间所形成的数集的ForbiddenSum是多少。
Input
输入数据的第一行包含一个整数N,表示序列的长度。
接下来一行包含N个数,表示给定的序列A(从1标号)。
接下来一行包含一个整数M,表示询问的组数。
接下来M行,每行一对整数,表示一组询问。
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%的数据,1≤N,M≤100000,1≤A_i≤10^9,1≤A_1+A_2+…+A_N≤10^9。
Source
By yts1999
如果当前集合的子集和可以拼凑出[0,i]的所有数,那么也可以拼凑出[1,不大于i+1的所有数的和]
可以考虑倍增查询.
先从1开始,查所有比1小的数的和,
把和+1后继续查询,直到最后答案不再变化.
用主席树维护一下就行了.
讲道理是应该离散的,但是我看见有人没写离散就过了..所以就没写离散
看来数据实在是辣鸡..
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define lchild rt<<1,l,mid #define rchild rt<<1|1,mid+1,r #define ln rt<<1 #define rn rt<<1|1 #define MAXN 100010 #define SIZE 6000000 #define GET (ch>='0'&&ch<='9') using namespace std; void in(int &x) { char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar(); } int n,m,cnt,maxn; int a[MAXN],sta[MAXN]; int root[MAXN],ls[SIZE],rs[SIZE],sum[SIZE]; void ins(int x,int &y,int l,int r,int val) { sum[y=++cnt]=sum[x]+val; if (l==r) return; ls[y]=ls[x];rs[y]=rs[x];int mid=(l+r)>>1; if (val<=mid) ins(ls[x],ls[y],l,mid,val); else ins(rs[x],rs[y],mid+1,r,val); } int query(int x,int y,int l,int r,int val) { if (l>val||!(sum[y]-sum[x])) return 0; if (val>=r) return sum[y]-sum[x]; int mid=(l+r)>>1,ret=0; (ret=query(ls[x],ls[y],l,mid,val))+=(val>mid?query(rs[x],rs[y],mid+1,r,val):0); return ret; } int ask(int l,int r) { for (int i=1,last;;i=last+1) if ((last=query(root[l],root[r],1,maxn,i))<i) return i; } int main() { in(n);int l,r; for (int i=1;i<=n;i++) in(a[i]),maxn=max(maxn,a[i]); for (int i=1;i<=n;i++) ins(root[i-1],root[i],1,maxn,a[i]); for (in(m);m;m--) in(l),in(r),printf("%d\n",ask(l-1,r)); }
相关文章推荐
- [BZOJ2006][NOI2010][RMQ/主席树][二叉堆]超级钢琴
- BZOJ 2588 Count On a Tree 【LCA】【主席树】
- 主席树(可持久化线段树)入门专题
- BZOJ3209 花神的嘲讽计划I
- POJ 2104 K-th Number
- SPOJ COT 10628 Count on a tree
- ZOJ 2112 Dynamic Rankings
- HDU 4417 Super Mario
- HDU 4348 To the moon
- Codeforces 587C Duff in the Army
- bzoj-3123 森林
- poj 2104 K-th Number (主席树学习第一弹)
- hdu 4605 Magic Ball Game(主席树学习第二弹)
- hdu 4866 Shooting(主席树学习第三弹)
- hdu 3727 Jewel(主席树学习第四弹)
- 【Poi2014】【BZOJ3524】Couriers
- 【BZOJ4209】西瓜王
- 【ONTAK2010】【BZOJ3551】Peaks加强版
- 【IOI2014】【BZOJ4367】holiday假期
- SPOJ 10628 Count on The tree .. .. 主席树