先看一下对于给定的一段如何暴力求最大值,首先将这一段排序,然后如果存在某一个数,这个数比它前面的数的前缀和至少大2,那么答案就是它前面那个数的前缀和+1。

那么假设现在处理了前面较小的一些数之后的答案为ans,然后可以求出比ans小的数的总和t,如果t<ans,那么答案就是ans;否则将ans更新为t+1。可以发现两次更新之后ans必然翻倍,那么更新的次数为O(logΣA),注意到可以用主席树维护这个和,那么每次查询就是O(logN)。因此总的时间复杂度为O(MlogNlogΣA)。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
#define M 2000005
using namespace std;int n,cnt,trtot,a[N],num[N],rt[N],sum[M],ls[M],rs[M];
int read(){int x=0; char ch=getchar();while (ch<'0' || ch>'9') ch=getchar();while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }return x;
}
int find(int x){int l=1,r=cnt+1,mid;while (l+1<r){mid=(l+r)>>1;if (num[mid]<=x) l=mid; else r=mid;}return l;
}
void ins(int l,int r,int x,int &y,int u,int v){y=++trtot; sum[y]=sum[x]+v;if (l==r) return; int mid=(l+r)>>1;if (u<=mid){ rs[y]=rs[x]; ins(l,mid,ls[x],ls[y],u,v); }else{ ls[y]=ls[x]; ins(mid+1,r,rs[x],rs[y],u,v); }
}
int qry(int x,int y,int z){int l=1,r=cnt,mid,ans=0; x=rt[x-1]; y=rt[y];while (l<r){mid=(l+r)>>1;if (z<=mid){ r=mid; x=ls[x]; y=ls[y]; }else{ l=mid+1; ans+=sum[ls[y]]-sum[ls[x]]; x=rs[x]; y=rs[y]; }}return ans+sum[y]-sum[x];
}
int main(){n=read(); int i,l,r,ans,t;for (i=1; i<=n; i++) a[i]=num[i]=read(); n++;sort(num+1,num+n+1);cnt=1;for (i=2; i<=n; i++)if (num[i]!=num[cnt]) num[++cnt]=num[i];for (i=1; i<=n; i++) a[i]=find(a[i]);for (i=1; i<=n; i++) ins(1,cnt,rt[i-1],rt[i],a[i],num[a[i]]);int cas=read();while (cas--){l=read(); r=read();for (ans=1; ; ans=t+1){t=qry(l,r,find(ans));if (t<ans) break;}printf("%d\n",ans);}return 0;
}

by lych

2016.3.30

bzoj 4408: [FJOI2016]神秘数 主席树相关推荐

  1. LUOGU P4587 [FJOI2016]神秘数(主席树)

    传送门 解题思路 如果区间内没有\(1\),那么答案就为\(1\),从这一点继续归纳.如果区间内有\(x\)个\(1\),设区间内\([2,x+1]\)的和为\(sum\),如果\(sum=0\),那 ...

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

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

  4. [FJOI 2016]bzoj 4408 神秘数 - 线段树

    题目大意:给你一列数,多次询问用一个区间的数字形成一个可重集合,最小的不能被表示为其一个子集的数字是多少. 题解:考虑给你一个可重集合你怎么算:从小到大排序,假设用前x个数字不能表示的最小都数字是an ...

  5. [BZOJ4408][FJOI2016]神秘数(主席树)

    题目: 我是超链接 题解: 如果[1,x]可以取到,我们加入一个数y,如果y<=x+1,那么我们有新的取数集合[1,x+y]:如果y>x+1,那么x+1还是取不到啊,这样我们就有了一个暴力 ...

  6. BZOJ4408:[FJOI2016]神秘数

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  7. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6321  Solved: 2628 [ ...

  8. COGS 930. [河南省队2012] 找第k小的数 主席树

    主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 ...

  9. BZOJ 3524: [Poi2014]Couriers【主席树】

    3524: [Poi2014]Couriers [题目描述] 传送门 [题解] 主席树的裸题,要找出现次数大于一半的,那么他肯定出现在当前的左子树或右子树中,就这样查找就可以了. 代码如下 #incl ...

最新文章

  1. c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)
  2. nginx 配置的server_name参数(转)
  3. Linux fork()一个进程内核态的变化
  4. 解决配置shiro+jwt后swagger接口文档无法访问的问题
  5. Docker for windows 10
  6. linux基础系统命令大全
  7. Cloud for Customer UI里点了超链接后的跳转处理
  8. 模仿笔迹最好的软件_模仿签名代写签字行业进入战国时代,乱战模式开启!
  9. 《微观经济学》第六章供给、需求与政府政策
  10. tomcat 热部署 生产环境_详解tomcat热部署和热加载的方法
  11. 小米笔记本安装系统 声卡驱动安装不上
  12. mysql主从同步创建表不同步_MySQL新增数据库到主从同步列表 - 如何增加数据库到MySQL主从 - MySQL主从不同步解决办法...
  13. python将html转成pdf,python将html转成PDF的示例
  14. 重启explore(桌面进程)
  15. 国二c语言是人工改卷还是机器改卷,雅思机考作文是机器批卷吗,雅思机考,阅读和听力是机器判卷,还是人工判卷?...
  16. 投资,不能也不想做的太复杂
  17. yara规则--构建yara规则库
  18. 轻生男子受的哥劝慰3小时 为求死刑将其杀害
  19. python画素描画
  20. 比较器翻转抖动原因及对策

热门文章

  1. thinkphp5.1部署在百度云主机的注意事项
  2. java基于ssm的宠物狗商店交流网站
  3. “昆明城市咖啡地图”活动再度开启
  4. Win10正式企业版激活方法
  5. 1752年9月-----消失的那11天
  6. 一个苏州IT人的5年挨踢经历-------未来篇
  7. Tita :OKR落地推行的具体方法
  8. 前端实现图片压缩上传功能
  9. 20个月股票投资复盘:在被割韭菜中成长
  10. 微信小程序学习打卡(2)