题意:

q次询问,问[l,r]子区间的mex值

思路:

对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减

对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r]的mex

l每增大1,都要更新[l, next[l]-1],将这个区间内大于a[l]的值更新为a[l]

其中next[i]为i之后的下一个a[i]位置

代码:

线段树写的不熟。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string>
  7. #include<stack>
  8. #include<queue>
  9. #include<deque>
  10. #include<set>
  11. #include<vector>
  12. #include<map>
  13.  
  14. #define fst first
  15. #define sc second
  16. #define pb push_back
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define lson l,mid,root<<1
  19. #define rson mid+1,r,root<<1|1
  20. #define lc root<<1
  21. #define rc root<<1|1
  22. //#define lowbit(x) ((x)&(-x))
  23.  
  24. using namespace std;
  25.  
  26. typedef double db;
  27. typedef long double ldb;
  28. typedef long long ll;
  29. typedef unsigned long long ull;
  30. typedef pair<int,int> PI;
  31. typedef pair<ll,ll> PLL;
  32.  
  33. const db eps = 1e-;
  34. const int mod = 1e9+;
  35. const int maxn = 2e6+;
  36. const int maxm = 2e6+;
  37. const int inf = 0x3f3f3f3f;
  38.  
  39. const db pi = acos(-1.0);
  40.  
  41. int a[maxn];
  42. int n, q;
  43. int nx[maxn];
  44. int lst[maxn];
  45. struct node{
  46. int l, r;
  47. int id;
  48. }b[maxn];
  49. bool cmp(node a, node b){
  50. return a.l<b.l;
  51. }
  52. int mex[maxn];
  53. set<int>s;
  54. int dat[maxn];
  55. void build(int l, int r, int root){
  56. int mid = (l+r)>>;
  57. if(l==r){
  58. dat[root] = mex[l];
  59. return;
  60. }
  61. dat[root] = inf;
  62. build(lson);
  63. build(rson);
  64. return;
  65. }
  66. void pushdown(int l, int r, int root){
  67. if(l==r)return;
  68. dat[lc]=min(dat[lc],dat[root]);
  69. dat[rc]=min(dat[rc],dat[root]);
  70. return;
  71. }
  72. int ask(int x, int l, int r, int root){
  73. if(dat[root]!=inf)pushdown(l, r, root);
  74. if(l==r)return dat[root];
  75. int mid = (l+r)>>;
  76. if(x<=mid)return ask(x,lson);
  77. return ask(x,rson);
  78. }
  79. void update(int x, int y, int val, int l, int r, int root){
  80. if(dat[root]!=inf)pushdown(l,r,root);
  81. if(l==x&&y==r){
  82. dat[root]=min(dat[root],val);return;
  83. }
  84. int mid = (l+r)>>;
  85. if(y<=mid)update(x,y,val,lson);
  86. else if(x>mid)update(x,y,val,rson);
  87. else{
  88. update(x,mid,val,lson);
  89. update(mid+,y,val,rson);
  90. }
  91. return;
  92. }
  93. int ans[maxn];
  94. int main(){
  95. scanf("%d %d", &n, &q);
  96. for(int i = ; i <= n; i++){
  97. nx[i]=n+;
  98. }
  99. for(int i = ; i <= n; i++){
  100. scanf("%d", &a[i]);
  101. if(lst[a[i]]){
  102. nx[lst[a[i]]]=i;
  103. }
  104. lst[a[i]]=i;
  105. }
  106. int tmp = ;
  107.  
  108. for(int i = ; i <= n; i++){
  109. s.insert(a[i]);
  110. while(s.find(tmp)!=s.end()){
  111. tmp++;
  112. }
  113. mex[i]=tmp;
  114. }build(,n,);
  115. for(int i = ; i <= q; i++){b[i].id=i;
  116. scanf("%d %d", &b[i].l, &b[i].r);
  117. }
  118. sort(b+,b++q,cmp);
  119. int p = ;
  120. for(int i = ; i <= q; i++){
  121. while(p<b[i].l){
  122. //printf("\\\\%d\n",p);
  123. update(p,nx[p]-,a[p],,n,);
  124. //printf("---\n");
  125. p++;
  126. }
  127. //printf("==%d %d %d\n",b[i].id,b[i].l,b[i].r);
  128. //printf("--%d %d\n",i,ask(b[i].r,1,n,1));
  129. ans[b[i].id]=ask(b[i].r,,n,);
  130. }
  131. for(int i = ; i <= q; i++){
  132. printf("%d\n",ans[i]);
  133. }
  134. return ;
  135. }
  136.  
  137. /*
  138. 7 5
  139. 0 2 1 0 1 3 2
  140. 1 3
  141. 2 3
  142. 1 4
  143. 3 6
  144. 2 7
  145. */

BZOJ 3339 Rmq Problem(离线+线段树+mex函数)的更多相关文章

  1. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  2. BZOJ 3339: Rmq Problem 莫队算法

    3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...

  3. BZOJ 3339: Rmq Problem

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1075  Solved: 549[Submit][Status][ ...

  4. [BZOJ3339] Rmq Problem(线段树)

    传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...

  5. bzoj 3339 Rmq Problem / mex

    题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...

  6. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  7. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  9. BZOJ_2298_[HAOI2011]problem a_线段树

    BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...

随机推荐

  1. java基础之----redi分布式锁

    最近项目中,用到了redis分布式锁,使用过程有些心得,所以希望分享给大家. 首先我们意识里要知道分布锁有哪些? 分布式锁一般分三种,基于数据库的乐观锁,基于redis的分布式锁,基于zookeper ...

  2. 还在使用OpenGL ES做渲染,你Out了,赶紧来拥抱Vulkan吧~

    背景介绍 Vulkan是Khronos组织制定的"下一代"开放的图形显示API.是与DirectX12能够匹敌的GPU API标准. Vulkan是基于AMD的Mantle API ...

  3. linux各目录及重要目录的详细介绍

    1 目录说明 根目录 (/) /bin bin是Binary的缩写, 这个目录存放着最经常使用的命令,比如ls,cat,mkdir等 /dev dev是Device(设备)的缩写, 该目录下存放的是L ...

  4. 侠说java8--Stream流操作学习笔记,都在这里了

    前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...

  5. 【Java基础总结】泛型

    泛型实现了参数化类型的概念,使代码可以应用于多种类型. 1. 泛型类 声明的泛型类型静态方法不能使用 class Tools<T>{ private T t; public void se ...

  6. PQSQL 按照时间进行分组

    按照时间分组时一般是按照年.月.日进行分组,不会把时分秒也算进去,所以需要把时间戳提取出所需要的时间段,本质上是把时间戳格式化成对应形式的字符串,这个过程需要用to_char(timestamp, t ...

  7. TensorFlow——卷积神经网络的相关函数

    在TensorFlow中,使用tr.nn.conv2d来实现卷积操作,使用tf.nn.max_pool进行最大池化操作.通过闯传入不同的参数,来实现各种不同类型的卷积与池化操作. 卷积函数tf.nn. ...

  8. oracle的一些简单语法

    1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...

  9. java 储存机制

    1.栈 statck 局部变量名称 2.堆 heap 带new的 3.方法区 method area .class

  10. flash-session

    作用:更改session存储的位置 1.session默认存放在浏览器的cookie中 源码 wsgi->app.__call__->wsgi_app->push->self. ...