LUOGU P4587 [FJOI2016]神秘数(主席树)
##解题思路
如果区间内没有$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;
}
LUOGU P4587 [FJOI2016]神秘数(主席树)的更多相关文章
- P4587 [FJOI2016]神秘数(主席树)
题意:给出1e5个数 查询l,r区间内第一个不能被表示的数 比如1,2,4可以用子集的和表示出[1,7] 所以第一个不能被表示的是8 题解:先考虑暴力的做法 把这个区间内的数字按从小到大排序后 从前往 ...
- Luogu P4587 [FJOI2016]神秘数
一道好冷门的好题啊,算是对于一个小结论和数据结构的一点考验吧 首先看完题目我们发现要从这个神秘数的性质入手,我们观察or手玩可得: 如果有\(x\)个\(1\),那么\([1,x]\)都是可以表示出来 ...
- [[FJOI2016]神秘数][主席树]
明白之后 5min 就写好了-自闭- 这题的题意是问你 \([L,R]\) 区间的数字不能构成的数字的最小值- 首先考虑 如果 \([1,x]\) 可以被表示 那么加入一个 \(a_i\) 显然 \( ...
- 洛谷P4587 [FJOI2016]神秘数(主席树)
题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...
- 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)
好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...
- 洛谷 P4587 [FJOI2016]神秘数
大鸽子 llmmkk 正在补8.3号咕掉的题 时隔两个月,再看到这道题,我又是一脸懵,这种思维的培养太重要了 链接: P4587 题意: 给出 \(n\) 个点的序列,\(m\) 次询问区间神秘数. ...
- BZOJ 4408: [Fjoi 2016]神秘数 [主席树]
传送门 题意: 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},8无法表示为集合S的子集的和,故集合S的神秘数为8.现给定n个正整数a[1]. ...
- 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 = ...
- 【bzoj4408】[Fjoi 2016]神秘数 主席树
题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+1 ...
随机推荐
- Activity 启动模式总结
Activity 启动模式: 1. standard: 默认启动模式,每次启动一个Activity都会重新创建一个实例: 2. singleTop: 栈顶复用模式,新Activity位于任务栈的栈顶, ...
- Python中的时间模块和日期模块
Python 日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间 ...
- WCDB错误"No matching constructor for initialization of 'WCTColumnBinding'"
开始看到这个错误有点匪夷所思,完全不知道问题指向哪里, 最后用过排除法,把之前建立多个类进行了一一排除,发现有个属性是 @property(nonatomic, assign) NSInteger * ...
- 7 November in 614
每日总结不能少!让自己的头脑好好清醒清醒,才不会犯那些所谓的低级错误! Contest A. ssoj3045 A 先生砍香蕉树 根据数据范围 \(m\le 1000,b\le 10000\),显然本 ...
- 2018-2019-20175203 实验二 《Java面向对象程序设计》
2018-2019-20175203 实验二 <Java面向对象程序设计>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑 ...
- (转)阿里官方提供的dubbo-spring-boot-starter 1.0.1 整合的dubbo 2.6.0和spring boot 1.5.9 案例
作者:许浩_5e9f链接:https://www.jianshu.com/p/5381cc8876e3來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. springboo ...
- English-Difference between original and source
最近跟网页翻译怼上了,在给翻译前的页面起名是纠结于使用 original page 还是 source page,就查了一下 original 和 source 的区别. original: n. 原 ...
- Windows 08R2_AD图文详解
目录 目录 软件环境 Active Directory域服务 AD的应用 创建ADDS域 使用Windows窗口来创建ADDS域控制器 使用Powershell来创建ADDS域控制器 检查ADDC域控 ...
- USACO 5.4 章节
Canada Tour 题目大意 双向连通图,点从左向右排列, 你需要先从最左的点到最右的点,(过程中只能从左向右走) 然后再从最右的点返回最左的点,(过程中只能从右向左走) 过程中除了最左的点,其它 ...
- idea新手教程 如何springmvc创建Maven项目
1.点击Create project,选择maven,勾选Create from archetype选择web-app,如图 2 输入 Group-Id //组织名,也是作者名 Arti ...