[[FJOI2016]神秘数][主席树]
明白之后 5min 就写好了…自闭…
这题的题意是问你 \([L,R]\) 区间的数字不能构成的数字的最小值…
首先考虑 如果 \([1,x]\) 可以被表示
那么加入一个 \(a_i\) 显然 \([1,x+a_i]\) 都可以被表示
有什么好办法呢
当然有 \(O(q * \sum_{i\in[L,R]}{a_i}*[R-L+1])\)
(雾)
区间求和问题啥的考虑主席树,首先我不会证明复杂度,是因为我菜/kk
还是一样的套路 讨论 \([1,x]\)
对于区间求 \(\sum_{i\in[L,R]}[a_i<=ans]\)
\([ans\)初值是1\(]\)
显然此时 \([1,ans-1]\) 都可以表示出来 所以考虑扩大区间使得这个\(res = \sum_{i\in[L,R]}[a_i<=ans]\)
如果值比 \(ans\) 小肯定是不可以构成 \(ans+1\) 的 所以无需扩展…
#include<bits/stdc++.h>
using ll = long long ;
using namespace std ;
int read() {
int x = 0 , f = 1 ; char c = getchar() ;
while(c < '0' || c > '9') { if(c == '-') f = -1 ; c = getchar() ; }
while(c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c & 15) ; c = getchar() ; }
return x * f ;
}
const int N = 1e5 + 10 ;
const int MAXN = N << 5 ;
const int INF = 1e9 ;
int n , a[N] , rt[N] , ls[MAXN] , rs[MAXN] , sum[MAXN] , cnt = 0 ;
void upd(int pre , int & o , int l , int r , int pos , int val) {
ls[o = ++ cnt] = ls[pre] ; rs[o] = rs[pre] ; sum[o] = sum[pre] + val ;
if(l == r) return ; int mid = l + r >> 1 ;
if(pos <= mid) upd(ls[pre] , ls[o] , l , mid , pos , val) ;
else upd(rs[pre] , rs[o] , mid + 1 , r , pos , val) ;
}
int query(int a , int b , int l , int r , int L , int R) {
if(a <= l && r <= b) return (sum[R] - sum[L]) ;
int mid = l + r >> 1 , ans = 0 ;
if(a <= mid) ans += query(a , b , l , mid , ls[L] , ls[R]) ;
if(b > mid) ans += query(a , b , mid + 1 , r , rs[L] , rs[R]) ;
return ans ;
}
signed main() {
n = read() ;
for(int i = 1 ; i <= n ; i ++) a[i] = read() ;
for(int i = 1 ; i <= n ; i ++) upd(rt[i - 1] , rt[i] , 1 , INF , a[i] , a[i]) ;
int m = read() ;
while(m --) {
int L = read() , R = read() , ans = 1 ;
while(1) {
int res = query(1 , ans , 1 , INF , rt[L - 1] , rt[R]) ;
if(res >= ans) ans = res + 1 ;
else break ;
}
printf("%d\n" , ans) ;
}
return 0 ;
}
[[FJOI2016]神秘数][主席树]的更多相关文章
- P4587 [FJOI2016]神秘数(主席树)
题意:给出1e5个数 查询l,r区间内第一个不能被表示的数 比如1,2,4可以用子集的和表示出[1,7] 所以第一个不能被表示的是8 题解:先考虑暴力的做法 把这个区间内的数字按从小到大排序后 从前往 ...
- LUOGU P4587 [FJOI2016]神秘数(主席树)
传送门 解题思路 如果区间内没有\(1\),那么答案就为\(1\),从这一点继续归纳.如果区间内有\(x\)个\(1\),设区间内\([2,x+1]\)的和为\(sum\),如果\(sum=0\),那 ...
- 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 ...
- BZOJ 4408: [Fjoi 2016]神秘数 主席树 + 神题
Code: #include<bits/stdc++.h> #define lson ls[x] #define mid ((l+r)>>1) #define rson rs[ ...
- 【BZOJ4408】[FJOI2016]神秘数(主席树)
[BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...
- (bzoj4408)[FJOI2016]神秘数(可持久化线段树)
(bzoj4408)[FJOI2016]神秘数(可持久化线段树) bzoj luogu 对于一个区间的数,排序之后从左到右每一个数扫 如果扫到某个数a时已经证明了前面的数能表示[1,x],那么分情况: ...
- 【LG4587】[FJOI2016]神秘数
[LG4587][FJOI2016]神秘数 题面 洛谷 题解 首先我们想一想暴力怎么做 对于一段区间\([l,r]\) 我们先将它之间的数升序排序 从左往右扫, 设当前我们可以表示出的数为\([1,x ...
随机推荐
- 08-JavaScript基础
今日知识 1. JavaScript基础 2. 案例 3.总结 JavaScript介绍: * 概念:一门客户端脚本语言 * 运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎 * ...
- 将你的Archlinux打造成路由器
弄了一块J2900双千兆网口的工控板回来(奇怪的型号)当软路由用,无奈我又想各种皮,还想装桌面环境配VNC,而且我还对虚拟机不感冒(况且这U还不支持直通),只得放弃所有路由器系统.作为一名Arch铁粉 ...
- Magicodes.IE基础教程之导出Pdf
原文作者:hueifeng 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性说明 PdfEx ...
- C# 8.0 新特性之二:接口默认实现
在C#8.0中,针对接口引入了一项新特性,就是可以指定默认实现,方便对已有实现进行扩展,也对面向Android和Swift的Api进行互操作提供了可能性.下面我们来看看该特性的的概念.规 ...
- vue循环语句
循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名. v-for 可以绑定数据到数组来渲染 ...
- leaflet结合turf.js实现多边形分割(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- Java虚拟机——JVM
一.JVM整体架构 1.JVM(Java虚拟机):指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现.常用的虚拟机有VMWare.Virtual Bo ...
- ts中基本数据类型(上)
/* 定义数组*/ var arr: number[] = [1, 2, 3]; var arr1: Array<number> = [1, 2, 3]; var arr2: [str ...
- Resnet——深度残差网络(一)
我们都知道随着神经网络深度的加深,训练过程中会很容易产生误差的积累,从而出现梯度爆炸和梯度消散的问题,这是由于随着网络层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定(特别大或特别小),出现最多 ...
- Docker Stack 学习笔记
该文为<深入浅出Docker>的学习笔记,感谢查看,如有错误,欢迎指正 一.简介 Docker Stack 是为了解决大规模场景下的多服务部署和管理,提供了期望状态,滚动升级,简单易用,扩 ...