题目描述

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]神秘数(可持久化线段树)相关推荐

  1. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 177  Solved: 128 [Submit][Stat ...

  2. ●BZOJ 4408 [Fjoi 2016]神秘数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题解: 主席树 首先,对于一些数来说, 如果可以我们可以使得其中的某些数能够拼出 1- ...

  3. 4408: [Fjoi 2016]神秘数

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 452  Solved: 273 [Submit][Stat ...

  4. 【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 = ...

  5. 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 = ...

  6. BZOJ4408: [Fjoi 2016]神秘数

    考虑处理单组询问 一开始ans=1,每次统计<=ans的数的和sum,若sum>=ans,就用sum+1更新ans 最坏情况下,ans的更新是1,2,3,5,8-.是斐波拉契数列 所以an ...

  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  8. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  9. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

最新文章

  1. 网络协议分层_接口测试之网络分层和数据
  2. 一些基于深度学习的视觉里程计/SLAM开源代码
  3. 关于谷歌浏览器 点击元素便签出现外边框的情况解决办法
  4. 使用Blazor做个简单的时间戳在线转换工具
  5. 光棍节程序员闯关秀过关全攻略
  6. 窗体控件绑定数组 c# 1613698204
  7. 笔记-JavaWeb学习之旅19
  8. 中内连和外联的去区别_外联请客丨第一百七十四期:鱼来了铁板烧请你吃铁板烤鱼和香辣牛蛙虾!...
  9. Adobe Flash Player30.0.0.113离线安装包
  10. python黑屏改成白底_Python 进行黑屏 PNR 的提取
  11. ‘com.cloudera.server.cmf.TrialState‘:Cannot resolve reference to bean ‘entityManagerFactoryBean‘
  12. 在d盘创建文件夹,里面有aaa.txt/bbb.txt/ccc.txt,然后遍历出aaa文件夹下的文件(新手用于记录每天的作业)...
  13. 【MC 网易-我的世界-mod开发基础笔记】 --- 常用的在线工具
  14. httpcanary和fiddler的使用教程
  15. 逻辑与计算机设计基础实验报告,逻辑和计算机设计基础--课实验报告.doc
  16. 七天免登陆有效期 java_JWT过期刷新问题,实现十五天免登陆
  17. Automatic Targetless LiDAR-CameraCalibration: A Survey论文解读
  18. 癃闭病以及其常见药方
  19. Grapher class scatter legend
  20. ubuntu中firefox无法播放视频的解决方法

热门文章

  1. WOT讲师杨钊:人工智能将在不同应用场景逐步落地
  2. 给Java小白,整理一套能上手的简单编程算法题【含答案】!!!
  3. STL容器系列文章:array容器
  4. JS逆向之巨量创意signature签名
  5. smb连接错误“请检查服务器名称或IP地址,然后再试一次,如果问题持续发生,请联系系统管理员“
  6. Imagination官方信息速递2020年11月期
  7. 冒着被打风险,揭秘软件测试工程师面试套路和暗语
  8. mikumikudance[MMD]快捷键使用
  9. 基于逻辑回归的讽刺文本检测
  10. 数据库mysql工序_网易杭研总结:数据库高可用技术之道(4)