题目大意:给你一列数,多次询问用一个区间的数字形成一个可重集合,最小的不能被表示为其一个子集的数字是多少。
题解:考虑给你一个可重集合你怎么算:从小到大排序,假设用前x个数字不能表示的最小都数字是ans,那么如果a[x+1]>ans,则ans就是答案,否则ans+=a[++x]。这个过程显然可以线段树每次区区间最小值,加上,然后把这个最小值设为INF,但是复杂度是不对的,例如全是1。但是发现这个过程显然可以优化:若当前答案是ans,已经加入了a[1…x],而a[(x+1)…y]<=ans,那么可以一口气把a[(x+1)…y]加到ans上(此时ans=\sum_{i=1}^y a[i])。这样做好像复杂度还是不靠谱?其实是对的,考虑一个数字x,再第i轮(此时答案记做ans[i])没有被加入,而第i+1轮被加入了,意味着x>ans[i],而从第i轮到第i+2轮,ans至少翻了一倍。因此用主席树维护上述过程,复杂度两个log。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define gc getchar()
#define N 100010
#define pb push_back
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
struct segment{int s;segment *ch[2];
}*T[N];int m,a[N];vector<int> v;
inline int getid(int x) { return lower_bound(v.begin(),v.end(),x)-v.begin()+1; }
int build(segment* &rt,int l,int r)
{rt=new segment,rt->s=0;if(l==r) return 0;int mid=(l+r)>>1;return build(rt->ch[0],l,mid),build(rt->ch[1],mid+1,r),0;
}
int update(segment* &x,segment* &y,int l,int r,int p,int v)
{x=new segment,x->s=y->s+v,x->ch[0]=y->ch[0],x->ch[1]=y->ch[1];if(l==r) return 0;int mid=(l+r)>>1;if(p<=mid) update(x->ch[0],y->ch[0],l,mid,p,v);if(mid<p) update(x->ch[1],y->ch[1],mid+1,r,p,v);return 0;
}
int query(segment* &rt,int l,int r,int s,int t)
{if(s<=l&&r<=t) return rt->s;int mid=(l+r)>>1,ans=0;if(s<=mid) ans+=query(rt->ch[0],l,mid,s,t);if(mid<t) ans+=query(rt->ch[1],mid+1,r,s,t);return ans;
}
int query(int l,int r,int p)
{int t=getid(p);if(v[t-1]>p) t--;if(!t) return 0;return query(T[r],1,m,1,t)-query(T[l-1],1,m,1,t);
}
int main()
{int n=inn();for(int i=1;i<=n;i++) a[i]=inn(),v.pb(a[i]);sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());m=(int)v.size();build(T[0],1,m);for(int i=1;i<=n;i++)update(T[i],T[i-1],1,m,getid(a[i]),a[i]);for(int q=inn();q;q--){int l=inn(),r=inn(),ans=0,t;while(ans<(t=query(l,r,ans+1))) ans=t;printf("%d\n",ans+1);}return 0;
}

[FJOI 2016]bzoj 4408 神秘数 - 线段树相关推荐

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

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

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  5. COCI 2015/2016 PROKLETNIK(单调栈+线段树)

    COCI 2015/2016 PROKLETNIK 题目大意 给定序列A1..NA_{1..N}A1..N​,分别求出QQQ组询问区间[L,R][L,R][L,R]中最长的连续子序列Al..rA_{l ...

  6. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  7. BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4422 我真服了..这题我能调一天半,最后还是对拍拍出来的...脑子还是有病啊 题解: ...

  8. BZOJ 1135 [POI2009]Lyz 线段树

    题意:链接 方法:线段树维护子区间最值. 解析: 我们可以推出来一个式子. 就是如果满足题意的话. 那么任意一个子区间[l,r] f[i]表示穿i的鞋的人数 (r−l+1+d)∗k>=∑f[i] ...

  9. BZOJ[1135][POI2009]Lyz 线段树

    传送门ber~ 如果某时不合法,那一定存在某段满足 (r−l+1+d)∗k<Σl≤i≤rnumi(r−l+1+d)∗k<Σl≤i≤rnumi (r-l+1+d)*k (其中 numinum ...

最新文章

  1. webpack基本用法
  2. 根据12和24小时制选择不同的时间显示
  3. 中国航发牵手阿里云共同打造:航空新引擎
  4. IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合
  5. 神经网络为什么要加偏置?---bias与费米能级εF
  6. 2.8 多任务学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  7. 从无到有算法养成篇-栈和队列·栈
  8. 引用类型的转换 java,java中引用类型的强制转换
  9. 牛式 Prime Cryptarithm
  10. Java多线程编程中Future模式的详解
  11. java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...
  12. Android多线程优劣,Android 开发中用到的几个多线程解析
  13. Status Code:200 OK (from disk cache)和304的区别,以及怎么禁止缓存
  14. 记一次因Redis使用不当导致应用卡死过程
  15. mysql 存储过程复杂查询_SQL分页存储过程 支持连接查询等复杂的SQL
  16. 在React中测试和调试
  17. python快速开发框架_GitHub - lee2029/pyui4win: 一个用python实现业务逻辑、用xml和html/css/js描述界面的windows程序的快速开发框架...
  18. mysql怎么设主键和外键_在MySQL中如何设置主键和外键
  19. 网络设计与系统集成概述
  20. 高斯过程回归(Gaussian Process Regression)

热门文章

  1. 湘潭大学数据原理实验
  2. ConstraintLayout中Chains和Guideline的使用
  3. 国家网络安全宣传周开幕 志翔科技护航核心数据与业务安全
  4. 巴贝奇的困境 by: 天涯ID--先生会算命V1
  5. 我的洛谷冬日绘板计划
  6. ESD静电保护二极管指南
  7. python操作excel 2016
  8. 深入理解Golang中的Context包
  9. 利用虚拟化实现PC平滑迁移
  10. XSS平台 XSS挑战之旅 解题记录 writeup