4408: [Fjoi 2016]神秘数

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 452  Solved: 273
[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

鸣谢yyh上传

 

【题解】:

暴力做法:首先将这一段排序,然后如果存在某一个数,这个数比它前面的数的前缀和至少大2,那么答案就是它前面那个数的前缀和+1。
    然而我们要想优化,才可AC。

  如果我们将这段数排序,并且已知前n个数的神秘数为x,即现在凑得的数的区间为[1,x],新加入的数为a,那么不难发现,我们凑得的数又得到了一段区间[a+1,a+x],那么如果a+1<=x,我们就可以拼上这两段,而神秘数变为a+x+1。

  也即是说,我们有当前解ans,我们将所有小等ans的数加起来(其实根据前面所推应该是小于,但是写小等不会错,而且对于代码来说更好些,至于为什么不多赘述),如果sigma<ans说明出现了断裂处,即此时ans为答案。否则我们将ans变为sigma+1,继续更新答案。

  时间复杂度0(nlogn*P),其中P为常数(当数列为斐波那契时会被卡到极限40)

题解转自网络。(毕竟太弱了。QAQ)

【代码】:

#include<cstdio>
using namespace std;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x;
}
const int N=1e5+10,M=N*100;
int n,m,sz,ans,root[N],ls[M],rs[M],sum[M];
void insert(int &k,int last,int l,int r,int val){k=++sz;ls[k]=ls[last];rs[k]=rs[last];sum[k]=sum[last]+val;if(l==r) return ;int mid=l+r>>1;if(val<=mid) insert(ls[k],ls[last],l,mid,val);else insert(rs[k],rs[last],mid+1,r,val);
}
int query(int x,int y,int l,int r,int lim){int mid=l+r>>1;if(r<=lim) return sum[y]-sum[x];else if(lim<=mid) return query(ls[x],ls[y],l,mid,lim);else return sum[ls[y]]-sum[ls[x]]+query(rs[x],rs[y],mid+1,r,lim);
}
int main(){n=read();for(int i=1;i<=n;i++) insert(root[i],root[i-1],1,1e9,read()); m=read();for(int i=1,l,r;i<=m;i++){l=read();r=read();ans=1;for(int sigma;(sigma=query(root[l-1],root[r],1,1e9,ans))>=ans;ans=sigma+1);printf("%d\n",ans);}return 0;
}

 

转载于:https://www.cnblogs.com/shenben/p/6272499.html

4408: [Fjoi 2016]神秘数相关推荐

  1. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 177  Solved: 128 [Submit][Stat ...

  2. ●BZOJ 4408 [Fjoi 2016]神秘数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题解: 主席树 首先,对于一些数来说, 如果可以我们可以使得其中的某些数能够拼出 1- ...

  3. BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)

    题目描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...

  4. 【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 = ...

  5. 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 = ...

  6. BZOJ4408: [Fjoi 2016]神秘数

    考虑处理单组询问 一开始ans=1,每次统计<=ans的数的和sum,若sum>=ans,就用sum+1更新ans 最坏情况下,ans的更新是1,2,3,5,8-.是斐波拉契数列 所以an ...

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

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

  8. 【FJOI2016】【BZOJ4408】神秘数

    [题目链接] BZOJ4408(权限题) [前置技能] 主席树 [题解] 首先先考虑一种时间复杂度为O(QNlogN)O(QNlogN)O(QNlogN)的暴力做法:将所有数按从小到大排序,考虑做到第 ...

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

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

最新文章

  1. opencv滤波美颜
  2. LINUX使用tcgetattr函数与tcsetattr函数控制终端二
  3. unix环境高级编程-进程间通信
  4. Detectron2学习笔记
  5. Java——网络编程三要素
  6. Apache kafka原理与特性(0.8V)
  7. 消息称快手拟发行4.159亿股 招股价上限约93港元
  8. Excel 2007 Open XML文件结构~~~1
  9. 频率学派(Frequentists) 贝叶斯学派(Bayesians)
  10. chrome谷歌浏览器使用技巧
  11. 计算机相关论文摘要,计算机类论文摘要
  12. 国内国外常用外包平台大全汇总!
  13. WIFI破解原理(WEP)
  14. C语言的switch语句
  15. 高性能计算机软件循环流水,可重构编译中循环流水优化技术研究
  16. Vue表单输入绑定(元婴中期)
  17. Hadoop大数据系列组键-部署
  18. H264解析sps提取宽高(好用)
  19. 人形机器人视觉处理——垃圾分类
  20. 语音转文字怎么设置在线转换的操作

热门文章

  1. NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别
  2. 一次ajax请求返回状态为Cancled的记录
  3. 微软2016 9月笔试
  4. hdu 2669 Romantic
  5. .NET开发人员十大必备下载工具
  6. null对象访问static属性或方法
  7. 网页版本的飞行日志分析平台是_一个轻便的实时日志收集平台wslog
  8. 爬虫python代码网易云_python-网易云简单爬虫
  9. 北京理工大学计算机课答案,北京理工大学计算机专业考研课程模拟试题.doc
  10. ES基础命令(参照mysql)