传送门

解题思路

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

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>using namespace std;
const int N=100005;
const int M=N*33;
const int inf=1000000000;
typedef long long LL;template<class T> void rd(T &x){x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
}   int n,m,a[N],rt[N],ls[M],rs[M],sum[M],cnt;
LL Sum[M];void build(int &x,int l,int r,int k){x=++cnt;if(l==r) {sum[x]=1;Sum[x]=l;return ;}int mid=(l+r)>>1;if(k<=mid) build(ls[x],l,mid,k);else build(rs[x],mid+1,r,k);Sum[x]=Sum[ls[x]]+Sum[rs[x]];
}void update(int pre,int &x,int l,int r,int k){x=++cnt;ls[x]=ls[pre];rs[x]=rs[pre];if(l==r) {sum[x]=sum[pre]+1;Sum[x]=Sum[pre]+l;return;}int mid=(l+r)>>1;if(k<=mid) update(ls[pre],ls[x],l,mid,k);else update(rs[pre],rs[x],mid+1,r,k);Sum[x]=Sum[ls[x]]+Sum[rs[x]];
}int query_tot(int u,int v,int l,int r,int k){if(l==r) return sum[v]-sum[u];int mid=(l+r)>>1;if(k<=mid) return query_tot(ls[u],ls[v],l,mid,k);else return query_tot(rs[u],rs[v],mid+1,r,k);
}LL query_sum(int u,int v,int l,int r,int L,int R){if(L<=l && r<=R) return Sum[v]-Sum[u];int mid=(l+r)>>1;LL ret=0;if(L<=mid) ret+=query_sum(ls[u],ls[v],l,mid,L,R);if(mid<R) ret+=query_sum(rs[u],rs[v],mid+1,r,L,R);return ret;
}int main(){rd(n);rd(a[1]);build(rt[1],1,inf,a[1]);for(int i=2;i<=n;i++)rd(a[i]),update(rt[i-1],rt[i],1,inf,a[i]);rd(m);int l,r,now,k,tot,lst;while(m--){rd(l),rd(r);k=0;lst=0;while(1){now=query_sum(rt[l-1],rt[r],1,inf,lst,k+1);if(!now) break;lst=k+2;k=now+k;}printf("%d\n",k+1);}return 0;
}

转载于:https://www.cnblogs.com/sdfzsyq/p/10254219.html

LUOGU P4587 [FJOI2016]神秘数(主席树)相关推荐

  1. bzoj 4408: [FJOI2016]神秘数 主席树

    先看一下对于给定的一段如何暴力求最大值,首先将这一段排序,然后如果存在某一个数,这个数比它前面的数的前缀和至少大2,那么答案就是它前面那个数的前缀和+1. 那么假设现在处理了前面较小的一些数之后的答案 ...

  2. 【bzoj4408】[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 = ...

  3. BZOJ44084299[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 = ...

  4. [BZOJ4408][FJOI2016]神秘数(主席树)

    题目: 我是超链接 题解: 如果[1,x]可以取到,我们加入一个数y,如果y<=x+1,那么我们有新的取数集合[1,x+y]:如果y>x+1,那么x+1还是取不到啊,这样我们就有了一个暴力 ...

  5. [FJOI 2016]bzoj 4408 神秘数 - 线段树

    题目大意:给你一列数,多次询问用一个区间的数字形成一个可重集合,最小的不能被表示为其一个子集的数字是多少. 题解:考虑给你一个可重集合你怎么算:从小到大排序,假设用前x个数字不能表示的最小都数字是an ...

  6. BZOJ4408:[FJOI2016]神秘数

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  7. COGS 930. [河南省队2012] 找第k小的数 主席树

    主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...

  8. P4587-[FJOI2016]神秘数【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4587 题目大意 nnn个数,每次选择一个区间,然后询问这个区间的子集和所不能表示的最小的正整数. 解题思路 假设 ...

  9. [Bzoj4408]神秘数(主席树)

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

最新文章

  1. WCF错误:413 Request Entity Too Large
  2. mysql中int时间和datetime时间的互相转换
  3. 全球最大AI商业展会开幕,这家老牌巨头担当中国唯一代表
  4. day26 re正则表达式
  5. 机器学习笔记(九)聚类
  6. linux 之免交互操作
  7. 利用FPGA实现外设通信接口之:利用FPGA实现USB 2.0通信接口
  8. 好婚姻必定是灵魂佳偶
  9. jdbc 批量insert_037 深入JDBC中PreparedStatement对象使用
  10. for和select循环语句的应用实践
  11. 开始时间 结束时间,全程的运行时间的计算
  12. vs2010 正式版官方下载地址
  13. 【实习日报】2019年4月上半月 前端开发实习工作日报汇总
  14. 字符集详解(一看就懂系列)
  15. linux中tmp文件在哪,tmp是什么文件(了解linux系统目录,sys,tmp,usr,var)
  16. server is in use and cannot be deleted
  17. 【最新面试技巧分享】面试官想看到的以及面试者需要准备的!
  18. HP elitebook 735 g5 笔记本电脑升级BIOS驱动后Type-C无法扩展显示屏的解决方案
  19. java书写开头,JAVA代码书写规范汇总详解
  20. Apache Impala —— 3.4.0版本官方文档百度网盘下载链接

热门文章

  1. Cannot resolve symbol ‘NotBlank‘ Cannot resolve symbol ‘Email‘ Cannot resolve symbol ‘NotEmpty‘
  2. 出现java.lang.UnsupportedClassVersionError 错误的原因
  3. Vim skills
  4. linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置
  5. linux下启动和关闭网卡命令
  6. string类的用法详解
  7. sudo apt-get update 出错 Updating from such a repository can‘t be done securely, and is therefore
  8. es java api 创建索引结构_elasticsearch - 如何使用ES的Java API来创建一个新类型的索引 - SO中文参考 - www.soinside.com...
  9. SeqGAN——对抗思想与增强学习的碰撞
  10. Using Markov Chains for Android Malware Detection