bzoj4299
主席树+脑洞
首先我们有一个结论:如果我们已经凑出1-n,那么下一个数必须小于等于n+1才能凑出n+1,否则结束。
那么如果只有一次询问,我们把数组排序,然后扫一遍看每个数当前能不能加入。但是多组询问就不行了,这是我们就要用主席树。
主席树是权值线段树,我们维护区间和,但是我们不能扫一遍,就得进一步优化。
我们发现每次我们找<=n+1的数的和必须>上一次的结果才满足,否则退出,那么我们构造一个最小,发现是斐波那契数列,就是logn,每次主席树查找权值和就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, m, cnt, lim;
int lc[N], rc[N], root[N], x[N];
ll sum[N];
void update(int l, int r, int last, int &x, int pos)
{
x = ++cnt;
sum[x] = sum[last] + pos;
if(l == r) return;
int mid = (l + r) >> ;
lc[x] = lc[last];
rc[x] = rc[last];
if(pos <= mid) update(l, mid, lc[last], lc[x], pos);
else update(mid + , r, rc[last], rc[x], pos);
}
ll query(int l, int r, int x, int y, int k)
{
if(l == r)
{
if(k >= l) return sum[y] - sum[x];
else return ;
}
int mid = (l + r) >> ;
if(k <= mid) return query(l, mid, lc[x], lc[y], k);
else return sum[lc[y]] - sum[lc[x]] + query(mid + , r, rc[x], rc[y], k);
}
void build(int l, int r, int &x)
{
if(l > r) return;
x = ++cnt;
if(l == r) return;
int mid = (l + r) >> ;
build(l, mid - , lc[x]);
build(mid + , r, rc[x]);
}
int main()
{
scanf("%d", &n);
build(, n, root[]);
for(int i = ; i <= n; ++i)
{
scanf("%d", &x[i]); lim = max(lim, x[i]);
}
for(int i = ; i <= n; ++i)
update(, lim, root[i - ], root[i], x[i]);
scanf("%d", &m);
while(m--)
{
int l, r; ll S = ; scanf("%d%d", &l, &r);
for(; ;)
{
ll t = query(, lim, root[l - ], root[r], S);
if(t == S - )
break;
else
S = t + ;
}
printf("%lld\n", S);
}
return ;
}
bzoj4299的更多相关文章
- [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)$. ... 
- 【Codechef FRBSUM】【FJOI2016】【BZOJ4299】【BZOJ 4408】 可持久化线段树
		4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 475 Solved: 287[Submit][Status ... 
- BZOJ4299 & CC FRBSUM:ForbiddenSum & BZOJ4408 & 洛谷4587 & LOJ2174:[FJOI2016]神秘数——题解
		https://www.lydsy.com/JudgeOnline/problem.php?id=4299 https://www.lydsy.com/JudgeOnline/problem.php? ... 
- BZOJ4299: Codechef FRBSUM(主席树)
		题意 题目链接 数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数. 例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2( ... 
- (WC2016模拟十八)【BZOJ4299】[CodeChef]FRBSUM
		咕了若干天我终于来补坑了qwq HINT $1\leq N,M\leq 10^5$ $1\leq \sum A_i\leq 10^9$ 题解: 虽然场上做出来了但还是觉得好神啊! 假设当前集合能凑出$ ... 
- bzoj4408 [Fjoi 2016]神秘数 & bzoj4299 Codechef FRBSUM   主席树+二分+贪心
		题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id ... 
随机推荐
- Linux(Centos7)下搭建SVN服务器(新手上路)
			以前都是别人直接给地址在svn上,下载或者上传东西,如今要自己建一个版本库用来存放东西.1.安装svnyum install -y subversion 2.查看svn安装位置还有哪些文件rpm -q ... 
- css实现圆角效果
			源码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> & ... 
- Django基础——ORM字段和字段参数
			ORM概念: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象( 1. 不同的程序员写的SQL水平参差不齐 2. ... 
- 第八节:web爬虫之urllib(四)
			第三个 模块parse : 是一个工具模块,提供了许多 URL 处理方法,比如拆分.解析.合并等等的方法. 
- PAT 1121 Damn Single
			"Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ... 
- [bzoj4027][HEOI2015][兔子与樱花] (树形dp思想+玄学贪心)
			Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ... 
- c# 缓存!
			做项目的时候获取所有城市的时候,发现每次去获取都花费了很多时间,所以用缓存方法让效率更高! 这是我做的例子,如下: public class CacheGetCity { /// <summar ... 
- Mysql学习总结(42)——MySql常用脚本大全
			备份 (所有) C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqldump --no-defaults -hlocalhost -P3306 -u ... 
- mysql执行show processlist unauthenticated user 解决方法
			一台unibilling机器前几天突然负载变重. 在top中发现cpu被大量占用. agi程序运行的很慢,并出现僵尸进程. 其实当时只有50个左右的并发呼叫. 远远达不到正常水准. 重新启动机器问题也 ... 
- codevs3730 无线网络发射选址
			题目描述 Description 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形 ... 
