题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=4408

题解:

主席树
首先,对于一些数来说,
如果可以我们可以使得其中的某些数能够拼出 1~ret
那么此时的ANS(神秘数)= ret+1
然后考虑,如果此时存在另一个数小于等于 ANS,(设该数为 x)
则一定可以在原来的1~ret的基础上拼出 1~ret+x
即 ANS 可以更新为 ret+x+1
所以具体的操作就是:
每次查询区间内小于ANS的数的和(SUM),然后如果SUM大于ANS,则更新ANS为SUM+1。
不断上述操作直到SUM<ANS为止。
主席数实现在序列区间中查询权值区间的和。

代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100500
using namespace std;
int A[MAXN],tmp[MAXN];
int N,M,tnt;
struct CMT{long long sum[MAXN*20];int rt[MAXN],ls[MAXN*20],rs[MAXN*20],sz;void Insert(int v,int &u,int l,int r,int p){u=++sz; ls[u]=ls[v]; rs[u]=rs[v]; sum[u]=sum[v]; sum[u]+=tmp[p];if(l==r) return;int mid=(l+r)>>1;if(p<=mid) Insert(ls[v],ls[u],l,mid,p);else Insert(rs[v],rs[u],mid+1,r,p);}long long Query(int v,int u,int l,int r,int al,int ar){if(al<=l&&r<=ar) return sum[u]-sum[v];int mid=(l+r)>>1; long long ret=0;if(al<=mid) ret+=Query(ls[v],ls[u],l,mid,al,ar);if(mid<ar) ret+=Query(rs[v],rs[u],mid+1,r,al,ar);return ret;}void Build(){for(int i=1;i<=N;i++)Insert(rt[i-1],rt[i],1,tnt,A[i]);}
}DT;
int main(){
//  freopen("/home/noilinux/Documents/Code/BZOJ/4408.in","r",stdin);
//  printf("BEGIN.\n");scanf("%d",&N);for(int i=1;i<=N;i++)scanf("%d",&A[i]),tmp[i]=A[i];sort(tmp+1,tmp+N+1);tnt=unique(tmp+1,tmp+N+1)-tmp-1;for(int i=1;i<=N;i++)A[i]=lower_bound(tmp+1,tmp+tnt+1,A[i])-tmp;scanf("%d",&M);DT.Build(); long long ANS,ret,p;for(int i=1,l,r;ANS=0,ret=0,i<=M;i++){scanf("%d%d",&l,&r);while(ANS<ret+1){ANS=ret+1;p=upper_bound(tmp+1,tmp+tnt+1,ANS)-tmp-1;ret=DT.Query(DT.rt[l-1],DT.rt[r],1,tnt,1,p);}printf("%lld\n",ANS);}return 0;
}

  

转载于:https://www.cnblogs.com/zj75211/p/8092630.html

●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 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...

  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. [Bzoj4408]神秘数(主席树)

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数. 例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...

  8. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...

  9. bzoj 1026 //1026: [SCOI2009]windy数

    bzoj 1026 //1026: [SCOI2009]windy数   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1026 / ...

最新文章

  1. 新书上市 | C程序员! 这可能是你搞定指针最轻松的方式
  2. 千万级在线推送系统架构解析
  3. 图解matlab基本操作
  4. Spark Streaming 实战案例(二) Transformation操作
  5. QT中图表类QChart之各种缩放/平移
  6. plantuml语法_PlantUML实践 | 思维导图
  7. Ubuntu瘦身与扩容运动
  8. 2016年,我的和自己谈谈
  9. 中国娱乐社交企业出海发展专题报告
  10. Docker(二十九)k8s 创建动态存储,基于nfs 的storageclass
  11. JVM监控及诊断工具命令行篇之jhat
  12. python调用swmm程序_Python SWMM5包_程序模块 - PyPI - Python中文网
  13. Mac下nginx的安装记录(亲测可用)
  14. 接口返回的是一个图片文件而不是url 前端如何显示?
  15. MATLAB 学习笔记(6)MATLAB 的 upsample 函数和 downsample 函数
  16. 有益视力的食疗方法(转载)
  17. mac pro 安装双系统与windows下解决右键问题
  18. linux下磁盘情况查询命令
  19. 小甲鱼——编程初学者的救赎
  20. 电脑W ndoWs在哪里,苹果电脑如何安装wndows系统.doc

热门文章

  1. HTML5怎么编辑另一个页面,html中嵌套iframe页面 如何将一个html页面中嵌入另一个html页面...
  2. jeecg-boot自动生成代码_无代码实现销售系统自动判定并生成订单功能
  3. python在福州能找到工作吗_如果只会Python能不能找到工作
  4. python批量发送邮件_Python批量发送邮件
  5. 二叉树的前序遍历Python解法
  6. 大数据平台CDH搭建
  7. html 编辑器 es6,小技巧:一行代码让浏览器瞬间变成临时编辑器
  8. Android 实现扑克牌动画,android – 重叠图像(扑克牌)
  9. mysqlsql怎么比较当前月与去年的这个月的同比_多数房企前10月业绩稳步增长 这12家企业为何“负增长”?...
  10. 系统无法在消息文件中为application_iOS 14 Filza 文件消息,M1 能用 win 系统