BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)
题目描述
http://www.lydsy.com/JudgeOnline/problem.php?id=4408
题目大意:求最小不能被一段区间中某些数的和表示的数。(还是看题面吧)
思路
可持久化线段树好题。话说为什么我打可持久总会看到可吃鸡。。
首先设能表示的一段区间为[1,x],则神秘数为x+1。当前加入一个数y,分为两种情况:
①y<=x+1,则能表示的区间变成[1,x+y],神秘数变成x+y+1。
②y>x+1,则x+1不能被表示,能表示的区间不变,神秘数不变。
于是我们维护区间的和。设神秘数为ans,一开始ans=1。找到一个区间中小于等于ans的数并求和,记为Get。如果Get>=ans, 则区间可以扩展变成[1,Get],ans=Get+1。
如果Get < ans,代表此时ans不会改变,神秘数就是现在的ans。
该题神奇的地方就在y>x+1的y对神秘数不产生任何影响,喵处就是y<=x+1的y可以一次性更新答案。
而找一个区间中小于等于某数的和可以用可持久化线段树来维护。即每个点开权值线段树上的一条链,然后维护前缀和就行了。
由于每次询问时间logN,而每次ans至少翻一番,所以总时间就是O(nlogN+mlogNlogN)。
代码
#include <bits/stdc++.h>
#define maxn 100010
#define Lg 32using namespace std;int a[maxn], n, m, cnt, ToT, ans, Get;struct Tnode{Tnode *lson, *rson;int sum;
}tree[maxn*Lg], *Root[maxn];Tnode *NewTnode(){tree[cnt].lson = tree[cnt].rson = tree;tree[cnt].sum = 0;return tree+cnt++;
}void Update(Tnode *root, int L, int R, int x){if(L == R){root->sum += x;return;}int mid = (L + R) >> 1;Tnode *p = NewTnode();if(x <= mid){*p = *(root->lson);root->lson = p;Update(p, L, mid, x);}else{*p = *(root->rson);root->rson = p;Update(p, mid+1, R, x);}root->sum = root->lson->sum + root->rson->sum;
}int Query(Tnode *root1, Tnode *root2, int L, int R, int x){if(L == R) return root2->sum - root1->sum;int mid = (L + R) >> 1;if(x <= mid) return Query(root1->lson, root2->lson, L, mid, x);else return root2->lson->sum - root1->lson->sum + Query(root1->rson, root2->rson, mid+1, R, x);
}int main(){scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &a[i]), ToT += a[i];Root[0] = NewTnode();for(int i = 1; i <= n; i++){Root[i] = NewTnode();*Root[i] = *Root[i-1];Update(Root[i], 1, ToT, a[i]);}scanf("%d", &m);int l, r;for(int i = 1; i <= m; i++){scanf("%d%d", &l, &r);ans = 1;for(;;){Get = Query(Root[l-1], Root[r], 1, ToT, ans);if(Get < ans) break;ans = Get + 1;}printf("%d\n", ans);}return 0;
}
BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)相关推荐
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 177 Solved: 128 [Submit][Stat ...
- ●BZOJ 4408 [Fjoi 2016]神秘数
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题解: 主席树 首先,对于一些数来说, 如果可以我们可以使得其中的某些数能够拼出 1- ...
- 4408: [Fjoi 2016]神秘数
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 452 Solved: 273 [Submit][Stat ...
- 【bzoj4408】[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 = ...
- BZOJ44084299[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]神秘数
考虑处理单组询问 一开始ans=1,每次统计<=ans的数的和sum,若sum>=ans,就用sum+1更新ans 最坏情况下,ans的更新是1,2,3,5,8-.是斐波拉契数列 所以an ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
最新文章
- 网络协议分层_接口测试之网络分层和数据
- 一些基于深度学习的视觉里程计/SLAM开源代码
- 关于谷歌浏览器 点击元素便签出现外边框的情况解决办法
- 使用Blazor做个简单的时间戳在线转换工具
- 光棍节程序员闯关秀过关全攻略
- 窗体控件绑定数组 c# 1613698204
- 笔记-JavaWeb学习之旅19
- 中内连和外联的去区别_外联请客丨第一百七十四期:鱼来了铁板烧请你吃铁板烤鱼和香辣牛蛙虾!...
- Adobe Flash Player30.0.0.113离线安装包
- python黑屏改成白底_Python 进行黑屏 PNR 的提取
- ‘com.cloudera.server.cmf.TrialState‘:Cannot resolve reference to bean ‘entityManagerFactoryBean‘
- 在d盘创建文件夹,里面有aaa.txt/bbb.txt/ccc.txt,然后遍历出aaa文件夹下的文件(新手用于记录每天的作业)...
- 【MC 网易-我的世界-mod开发基础笔记】 --- 常用的在线工具
- httpcanary和fiddler的使用教程
- 逻辑与计算机设计基础实验报告,逻辑和计算机设计基础--课实验报告.doc
- 七天免登陆有效期 java_JWT过期刷新问题,实现十五天免登陆
- Automatic Targetless LiDAR-CameraCalibration: A Survey论文解读
- 癃闭病以及其常见药方
- Grapher class scatter legend
- ubuntu中firefox无法播放视频的解决方法
热门文章
- WOT讲师杨钊:人工智能将在不同应用场景逐步落地
- 给Java小白,整理一套能上手的简单编程算法题【含答案】!!!
- STL容器系列文章:array容器
- JS逆向之巨量创意signature签名
- smb连接错误“请检查服务器名称或IP地址,然后再试一次,如果问题持续发生,请联系系统管理员“
- Imagination官方信息速递2020年11月期
- 冒着被打风险,揭秘软件测试工程师面试套路和暗语
- mikumikudance[MMD]快捷键使用
- 基于逻辑回归的讽刺文本检测
- 数据库mysql工序_网易杭研总结:数据库高可用技术之道(4)