BZOJ4299: Codechef FRBSUM(主席树)
题意
数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数。例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2(S’={1,1}),3(S’={3}),4(S’={1,3}),5(S' = {1, 1, 3}),但是它无法得到6。因此S的ForbiddenSum为6。给定一个序列A,你的任务是回答该数列的一些子区间所形成的数集的ForbiddenSum是多少。
Sol
若序列已经被从小到大排序
考虑当前位置为$i$,且$[1, s_i]$内的数都可以被拼成
那么若$a[i + 1] > s_i + 1$,那么$a[i + 1]$不能被拼成
于是我们可以这样去做
首先在集合内找比$s = 1$小的数的和(也就相当于上面的前缀和),若比$1$少,则答案为$1$
若询问得到的结果是$1$,则$s = 1 + 1 = 2$,此时我们去找比$2$小的和
若$< 2$,则答案为$2$,不断做下去,直到不符合条件为止。
不符合条件,实际上也就是$a[i + 1] > s_i + 1$
每次在一段区间内询问小于等于某一个数的和,可以用主席树维护,
时间复杂度:若一直是符合条件的,我们每次询问会至少让si翻一倍,因此单次询问的复杂度为log sn,
加上主席树的复杂度,总复杂度为$O(Q logn log sn)$
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = * 1e6 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, a[MAXN], lim;
int ls[MAXN], rs[MAXN], sum[MAXN], tot, root[MAXN];
void insert(int &k, int p, int l, int r, int pos) {
k = ++ tot;
ls[k] = ls[p]; rs[k] = rs[p]; sum[k] = sum[p] + pos;
if(l == r) return ;
int mid = l + r >> ;
if(pos <= mid) insert(ls[k], ls[p], l, mid, pos);
else insert(rs[k], rs[p], mid + , r, pos);
}
int Query(int k, int p, int l, int r, int val) {
if(l > val) return ;
if(r <= val) return sum[k] - sum[p];
int mid = l + r >> ;
int suml = sum[ls[k]] - sum[ls[p]];
if(val > mid) return suml + Query(rs[k], rs[p], mid + , r, val);
else return Query(ls[k], ls[p], l, mid, val);
}
int solve(int l, int r) {
int nxt = ;
for(int i = ; ; i = nxt + ) {
nxt = Query(root[r], root[l - ], , lim, i);//询问区间内<=i的数的和
if(nxt < i) return i;
}
}
int main() {
N = read();
for(int i = ; i <= N; i++) a[i] = read(), lim = max(a[i], lim);
for(int i = ; i <= N; i++) insert(root[i], root[i - ], , lim, a[i]);
int Q = read();
while(Q--) {
int l = read(), r = read();
printf("%d\n", solve(l, r));
}
return ;
}
BZOJ4299: Codechef FRBSUM(主席树)的更多相关文章
- bzoj4408 [Fjoi 2016]神秘数 & bzoj4299 Codechef FRBSUM 主席树+二分+贪心
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ.4299.Codechef FRBSUM(主席树)
题目链接 记mx为最大的满足1~mx都能组成的数. 考虑当前能构成1~v中的所有数,再加入一个数x,若x>v+1,则mx=v,x不会产生影响:否则x<=v+1,则新的mx=x+v. 对于区 ...
- [BZOJ4408&&BZOJ4299][FJOI2016 && Codechef]神秘数&&FRBSUM(主席树)
4299: Codechef FRBSUM Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 550 Solved: 351[Submit][Statu ...
- BZOJ4299 Codechef FRBSUM(主席树)
感觉非常不可做,于是考虑有什么奇怪的性质. 先考虑怎么求子集和mex.将数从小到大排序,假设已经凑出了0~n的所有数,如果下一个数>n+1显然mex就是n+1了,否则若其为x则可以凑出1~n+x ...
- BZOJ4299 : Codechef FRBSUM
若$[0,i]$的数都可以得到,那么$[1,所有不大于i+1的数的和]$的数都可以得到. 如此暴力枚举答案,用可持久化线段树支持查询,因为每次数字至少翻一倍,所以复杂度为$O(m\log^2n)$. ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版(LCT + 主席树)
题意 \(N\) 个点 \(M\) 条边的无向图,询问保留图中编号在 \([l,r]\) 的边的时候图中的联通块个数. \(K\) 次询问强制在线. \(1\le N,M,K \le 200,000\ ...
随机推荐
- uC/OS-II源码分析(四)
内核结构 1, 临界区,OS_ENTER_CRITICAL和OS_EXIT_CRITICAL 为了处理临界区代码,必须关中断,等处理完毕后,再开中断.关中断可以避免其他任务或中断进入临界区代码.uC ...
- poj 3415 Common Substrings —— 后缀数组+单调栈
题目:http://poj.org/problem?id=3415 先用后缀数组处理出 ht[i]: 用单调栈维护当前位置 ht[i] 对之前的 ht[j] 取 min 的结果,也就是当前的后缀与之前 ...
- bzoj4763
$分块$ $一个很有趣的技巧$ $在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$ $预处理出每两个关键点的bitset$ $每次询问就暴力向上爬 ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- 如何解决 Matlab 画图时中文显示乱码的问题?
使用的是win10系统,从前几个月某一天,我的matlab的figure里的中文都变成了口口.很是郁闷,还以为是动到了什么配置引起的. 前几天更新了matlab 2018b,发现还有这个问题.就觉得不 ...
- 第3章 编写ROS程序-2
1.发布者程序 在本节中,我们将看到如何发送随机生成的速度指令到一个turtlesim海龟,使它漫无目的地巡游.这个程序的源文件称为pubvel,这个程序展示了从代码中发布消息涉及的所有要素. 其代码 ...
- windows64位 redis安装 步骤
官方下载:http://redis.io/download 可以根据需要下载不同版本 windows版:https://github.com/MSOpenTech/redis/releases 在D盘 ...
- 通过xpath获取对应的整个子节点信息
1.页面解析接口 package com.dajiangtai.djt_spider.service; import com.dajiangtai.djt_spider.entity.Page; /* ...
- 小程序与Spring项目数据交互
上一篇博客刚说了利用Postman来测试Spring Boot项目,测试通过后就可以和小程序进行交互了. 首先要在微信开发者工具里面,点击"详情",勾选上"不校验合法域名 ...
- BDBR vs BDPSNR 计算方法 (转载)
转自:http://blog.csdn.net/menyangyang/article/details/42874575