传送门

##解题思路
  如果区间内没有$1$,那么答案就为$1$,从这一点继续归纳。如果区间内有$x$个$1$,设区间内$[2,x+1]$的和为$sum$,如果$sum=0$,那么答案为$x+1$,否则$[1,x+sum]$中的所有数字一定可以被表示,然后这个操作每次使答案至少扩大$1$倍,再用一个主席树维护,时间复杂度$O(nlognlogA)$

##代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. const int N=100005;
  8. const int M=N*33;
  9. const int inf=1000000000;
  10. typedef long long LL;
  11. template<class T> void rd(T &x){
  12. x=0;char ch=getchar();
  13. while(!isdigit(ch)) ch=getchar();
  14. while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  15. }
  16. int n,m,a[N],rt[N],ls[M],rs[M],sum[M],cnt;
  17. LL Sum[M];
  18. void build(int &x,int l,int r,int k){
  19. x=++cnt;
  20. if(l==r) {sum[x]=1;Sum[x]=l;return ;}
  21. int mid=(l+r)>>1;
  22. if(k<=mid) build(ls[x],l,mid,k);
  23. else build(rs[x],mid+1,r,k);
  24. Sum[x]=Sum[ls[x]]+Sum[rs[x]];
  25. }
  26. void update(int pre,int &x,int l,int r,int k){
  27. x=++cnt;ls[x]=ls[pre];rs[x]=rs[pre];
  28. if(l==r) {sum[x]=sum[pre]+1;Sum[x]=Sum[pre]+l;return;}int mid=(l+r)>>1;
  29. if(k<=mid) update(ls[pre],ls[x],l,mid,k);
  30. else update(rs[pre],rs[x],mid+1,r,k);
  31. Sum[x]=Sum[ls[x]]+Sum[rs[x]];
  32. }
  33. int query_tot(int u,int v,int l,int r,int k){
  34. if(l==r) return sum[v]-sum[u];
  35. int mid=(l+r)>>1;
  36. if(k<=mid) return query_tot(ls[u],ls[v],l,mid,k);
  37. else return query_tot(rs[u],rs[v],mid+1,r,k);
  38. }
  39. LL query_sum(int u,int v,int l,int r,int L,int R){
  40. if(L<=l && r<=R) return Sum[v]-Sum[u];
  41. int mid=(l+r)>>1;LL ret=0;
  42. if(L<=mid) ret+=query_sum(ls[u],ls[v],l,mid,L,R);
  43. if(mid<R) ret+=query_sum(rs[u],rs[v],mid+1,r,L,R);
  44. return ret;
  45. }
  46. int main(){
  47. rd(n);rd(a[1]);build(rt[1],1,inf,a[1]);
  48. for(int i=2;i<=n;i++)
  49. rd(a[i]),update(rt[i-1],rt[i],1,inf,a[i]);
  50. rd(m);int l,r,now,k,tot,lst;
  51. while(m--){
  52. rd(l),rd(r);k=0;lst=0;
  53. while(1){
  54. now=query_sum(rt[l-1],rt[r],1,inf,lst,k+1);
  55. if(!now) break;lst=k+2;k=now+k;
  56. }
  57. printf("%d\n",k+1);
  58. }
  59. return 0;
  60. }

LUOGU P4587 [FJOI2016]神秘数(主席树)的更多相关文章

  1. P4587 [FJOI2016]神秘数(主席树)

    题意:给出1e5个数 查询l,r区间内第一个不能被表示的数 比如1,2,4可以用子集的和表示出[1,7] 所以第一个不能被表示的是8 题解:先考虑暴力的做法 把这个区间内的数字按从小到大排序后 从前往 ...

  2. Luogu P4587 [FJOI2016]神秘数

    一道好冷门的好题啊,算是对于一个小结论和数据结构的一点考验吧 首先看完题目我们发现要从这个神秘数的性质入手,我们观察or手玩可得: 如果有\(x\)个\(1\),那么\([1,x]\)都是可以表示出来 ...

  3. [[FJOI2016]神秘数][主席树]

    明白之后 5min 就写好了-自闭- 这题的题意是问你 \([L,R]\) 区间的数字不能构成的数字的最小值- 首先考虑 如果 \([1,x]\) 可以被表示 那么加入一个 \(a_i\) 显然 \( ...

  4. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  5. 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)

    好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...

  6. 洛谷 P4587 [FJOI2016]神秘数

    大鸽子 llmmkk 正在补8.3号咕掉的题 时隔两个月,再看到这道题,我又是一脸懵,这种思维的培养太重要了 链接: P4587 题意: 给出 \(n\) 个点的序列,\(m\) 次询问区间神秘数. ...

  7. BZOJ 4408: [Fjoi 2016]神秘数 [主席树]

    传送门 题意: 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},8无法表示为集合S的子集的和,故集合S的神秘数为8.现给定n个正整数a[1]. ...

  8. BZOJ4408&4299[Fjoi 2016]神秘数——主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...

  9. 【bzoj4408】[Fjoi 2016]神秘数 主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+1 ...

随机推荐

  1. cf 811c Vladik and Memorable Trip

    原题链接:http://codeforces.com/contest/811/problem/C 题意:将数组中的连续数字连成若干个“线段”(或者不连),其实就是区间.区间必须满足对于其中的任意数字, ...

  2. 【HDOJ6610】Game(序列带修莫队)

    题意:有n堆石子,第n堆有a[i]个,A先选择一个范围[L,R],B选择一个子区间[l,r],之后照nim游戏的规则进行 现在有询问与操作 每次询问B在给定的[L,R]内有多少种子区间的取法使得A必胜 ...

  3. Bugku | Easy_vb

    载入ida,直接搜‘ctf’就有了,坑点是不要交“MCTF{XXX}”,要交“flag{XXXX}”

  4. vector代替数组

    vector代替数组 1.声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除). 2.用vector ...

  5. jmeter添加自定义扩展函数之MD5加密

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  6. Day 45 Mysql 数据库练习题二

    1.表关系   注意:创建表时,根据合理性设置字段的长度和类型. 2.下面:开始你的表演 1.查询所有人员信息 select * from ren 2.只查询人员的姓名和年龄 select name, ...

  7. 我的WordPress站点

    读取VDI文件 SSL和TLS Windows下使用vim的最佳方案:Sublime gdb用法 VMware的Guest与Host进行通信的三种方式 加密与解密 漫谈保护模式 processing学 ...

  8. git使用记录六:对commit的message做处理

    修改最新commit的message git commit --amend 修改老旧commit的message 查询最新的三个log soaeon@DESKTOP-FUJJTHR MINGW64 / ...

  9. 百度网盘不限速-Motrix

    目录: Windows 下使用  Motrix Mac 下使用 BaiduNetdiskPlugin-macOS Mac 下使用 Motrix Windows 系统  Motrix 1. Google ...

  10. 如何使用 VLD 检测程序中的内存泄漏?

    下载地址:https://kinddragon.github.io/vld/ 下载 windows 安装包,进行安装即可,它会给你设置好 vs 的环境变量,使用时,直接在 vs ide 中包含即可. ...