(bzoj4408)[FJOI2016]神秘数(可持久化线段树)
(bzoj4408)[FJOI2016]神秘数(可持久化线段树)
对于一个区间的数,排序之后从左到右每一个数扫
如果扫到某个数a时已经证明了前面的数能表示[1,x],那么分情况:
a>x+1,不能继续表示下去,答案就是x+1
否则表示区间变为[1,x+a]。
用主席树上二分优化这个过程。
1 #include<cstdio>
2 #include<algorithm>
3 using namespace std;
4 const int N=100069;
5 const int orz_phy=998244353;
6 #define cint const int
7 template<typename TP> inline void read(TP &_t)
8 {
9 TP _r=0,_f=1;char _c=getchar();
10 while(_c<'0'||_c>'9'){if(_c=='-')_f=-1;_c=getchar();}
11 while(_c>='0'&&_c<='9'){_r=_r*10+_c-'0';_c=getchar();}
12 _t=_r*_f;
13 }
14 int n,a[N];
15
16 int rt[N];
17 struct chairman
18 {
19 int s[N*88],son[N*88][2],ct;
20 void ins(cint pp,int &px,cint pl,cint pr,cint x)
21 {
22 px=++ct,s[px]=s[pp]+x;
23 if(pl==pr) return;
24 int mi=(pl+pr)>>1;
25 if(x<=mi) son[px][1]=son[pp][1],ins(son[pp][0],son[px][0],pl,mi,x);
26 else son[px][0]=son[pp][0],ins(son[pp][1],son[px][1],mi+1,pr,x);
27 }
28 int query(cint pp,cint px,cint pl,cint pr,cint l,cint r)
29 {
30 if(l<=pl&&pr<=r) return s[px]-s[pp];
31 int mi=(pl+pr)>>1;
32 int ret=0;
33 if(l<=mi) ret+=query(son[pp][0],son[px][0],pl,mi,l,r);
34 if(r>mi) ret+=query(son[pp][1],son[px][1],mi+1,pr,l,r);
35 return ret;
36 }
37 }ct;
38
39 int T,li,ri;
40 signed main()
41 {
42 read(n);
43 for(int i=1;i<=n;i++) read(a[i]),ct.ins(rt[i-1],rt[i],1,1000000000,a[i]);
44 read(T);
45 while(T--)
46 {
47 read(li),read(ri);
48 int ans=1,tmp=0;
49 while(orz_phy)
50 {
51 if((tmp=ct.query(rt[li-1],rt[ri],1,1000000000,1,ans))>=ans) ans=tmp+1;
52 else break;
53 }
54 printf("%d\n",ans);
55 }
56 return 0;
57 }
(bzoj4408)[FJOI2016]神秘数(可持久化线段树)的更多相关文章
- 【BZOJ-4408】神秘数 可持久化线段树
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 475 Solved: 287[Submit][Status ...
- BZOJ 4408 FJOI2016 神秘数 可持久化线段树
Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- BZOJ 4408: [Fjoi 2016]神秘数 可持久化线段树
4408: [Fjoi 2016]神秘数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 Description 一个可重复数字集 ...
- 51Nod 1175 区间中第K大的数 (可持久化线段树+离散)
1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ...
- [bzoj4408][Fjoi2016]神秘数
Description 一个可重复数字集合$S$的神秘数定义为最小的不能被$S$的子集的和表示的正整数. 例如$S={1,1,1,4,13}$, $1=1$, $2=1+1$, $3=1+1+1$, ...
- 题解【bzoj4587 & bzoj4408 [FJOI2016]神秘数】
Description \(n\) 个数的序列,每次询问一个区间,求最小的一个数使得不能用这个区间中的数之和表示. \(n \leq 10^5, \sum a_i \leq 10^9\) 这两个题一个 ...
- 【BZOJ4408】[FJOI2016]神秘数(主席树)
[BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...
- 【Codechef FRBSUM】【FJOI2016】【BZOJ4299】【BZOJ 4408】 可持久化线段树
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 475 Solved: 287[Submit][Status ...
随机推荐
- JS的一些对象
JS是基于对象的语言.当然此时都说是面向对象的语言. 类:模板,原型对象 对象:具体的实例 原型对象: var user = { name:"xiaoxiao", age:5 ...
- [LeetCode]1480. 一维数组的动态和
给你一个数组 nums .数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]-nums[i]) . 请返回 nums 的动态和. 示例 1: 输入:nums = [1, ...
- IDEA配置scala
IDEA中配置scala 准备:先下好IDEA和scala安装包,配置好jdk环境 scala不想去官网下载的可以直接去百度网盘下载 链接: 链接:https://pan.baidu.com/s/17 ...
- java运行原理、静态代理和动态代理区分
1.java的编译和运行原理: ■ 编译:将源文件 .java 文件,通过编译器(javac 命令) 编译成 字节码文件 .class 文件. ■ 运行,通过类加载器(以二进制流形式)把字节码加载进J ...
- Linux性能优化实战CPU篇之总结(四)
一.分析CPU瓶颈 1,性能指标 a>CPU使用率 CPU使用率描述了非空闲时间占总CPU时间的百分比,根据CPU上运行任务的不同可以分为:用户CPU.系统CPU.等待I/O CPU.软中断和硬 ...
- 【基础知识】CPU原理之减法、乘法和除法
中介绍了布尔逻辑.数学和电路的关系,我们也得到了与门.或门.非门.或非门.与非门.异或门等门电路以及一个加法器,并且了解了计算机是如何做加法的,这篇文章介绍一下计算机是如何做减法以及乘除法的. 0x0 ...
- C# 使用技巧区
1.事件中的技巧 (1)在事件发送者中,用delegate{}初始化事件.这样就不用每次在使用事件的时候判读事件是否为空了. delegate { }可以赋值给任何类型的委托.这个功能匿名方法特有的, ...
- mysql集群--基于centos7
1 MySQL主从备份 主机:192.168.43.8 从机:192.168.43.6 条件:主机和从机都安装了mysql,开启了二进制日志 安装mysql (mysql 和 mysql-server ...
- C# 定时器Timer
static void Main(string[] args) { #region 定时器 TimerDemo td = new TimerDemo("TimerDemo", 10 ...
- ELK监控nginx日志总结
ELK介绍 ELK即ElasticSearch + Logstash + kibana ES:作为存储引擎 Logstash:用来采集日志 Kibana可以将ES中的数据进行可视化,可以进行数据分析中 ...