一开始想的是莫队,然后维护几个bitset,然后瞎搞。脑子里想了想实现,发现并不好写。

还是主席树好写。我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标。我们查询的时候要在前\(r\)颗线段树中找到第一个出现的位置下标小于\(l\)的数,在线段树上二分就行了。

这个想法还是非常巧妙的。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=201000;
int n,m,b[N*2],a[N],root[N],mn[N*40],tot,num,cnt,ch[N*40][2];
void build(int l,int r,int &now){
now=++num;
if(l==r)return;
int mid=(l+r)>>1;
build(l,mid,ch[now][0]);
build(mid+1,r,ch[now][1]);
}
void add(int l,int r,int x,int w,int pre,int &now){
now=++num;
ch[now][0]=ch[pre][0];
ch[now][1]=ch[pre][1];
if(l==r){
mn[now]=w;
return;
}
int mid=(l+r)>>1;
if(x>mid)add(mid+1,r,x,w,ch[pre][1],ch[now][1]);
else add(l,mid,x,w,ch[pre][0],ch[now][0]);
mn[now]=min(mn[ch[now][0]],mn[ch[now][1]]);
}
int check(int l,int r,int x,int now){
while(l<r){
int mid=(l+r)>>1;
int tmp=mn[ch[now][0]];
if(tmp<x)now=ch[now][0],r=mid;
else l=mid+1,now=ch[now][1];
}
return b[l];
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int main(){
n=read(),m=read();
b[++cnt]=0;
for(int i=1;i<=n;i++)a[i]=read(),b[++cnt]=a[i],b[++cnt]=a[i]+1;
sort(b+1,b+1+cnt);
tot=unique(b+1,b+1+cnt)-b-1;
// build(1,tot,root[0]);
for(int i=1;i<=n;i++)add(1,tot,lower_bound(b+1,b+1+tot,a[i])-b,i,root[i-1],root[i]);
while(m--){
int l=read(),r=read();
printf("%d\n",check(1,tot,l,root[r]));
}
return 0;
}

luogu P4137 Rmq Problem / mex(可持久化线段树)的更多相关文章

  1. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  2. luogu P4137 Rmq Problem / mex 主席树 + 思维

    Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...

  3. 【luogu P4137 Rmq Problem / mex】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. # ...

  4. Luogu P4137 Rmq Problem / mex

    区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...

  5. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  6. P4137 Rmq Problem / mex (莫队)

    题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...

  7. [Codeforces 464E] The Classic Problem(可持久化线段树)

    [Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...

  8. OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树

    描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...

  9. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

随机推荐

  1. 堆————数据流的第k个大的元素

    解题思路 一般地,堆和堆排序——解决 "贪心算法及其类似问题" 的利器. # 思路:我们可以用一个小根堆来做,并且限制堆的大小为k,初始化时把nums的每个数都push到堆中,如果 ...

  2. POJ 3517 And Then There Was One( 约瑟夫环模板 )

    链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...

  3. [Atcoder Code Festival 2017 Qual B Problem F]Largest Smallest Cyclic Shift

    题目大意:给你\(A\)个a,\(B\)个b,\(C\)个c,要你构造一个字符串,使它的最小循环表示法最大.求这个表示法.解题思路:不知道怎么证,但把a.b.c当做单独的字符串扔进容器,每次把字典序最 ...

  4. ElasticSearch启动报错,bootstrap checks failed

    修改elasticsearch.yml配置文件,允许外网访问. vim config/elasticsearch.yml# 增加 network.host: 0.0.0.0 启动失败,检查没有通过,报 ...

  5. js获取当地时间并且拼接时间格式的三种方式

    js获取当地时间并且拼接时间格式,在stackoverflow上有人在问,查了资料,各种方法将时间格式改成任意自己想要的样式. 1. var date = new Date(+new Date()+8 ...

  6. 【中山市选2010】【BZOJ2467】生成树

    Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈. 在中心的这个n边圈的每一条边同一时候也是某一个五角形的一条边,一共同拥有n个不同的五角形.这些五角 ...

  7. POJ 2906 数学期望

    开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数.但很错误,没能转移下去.... 看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状 ...

  8. 【Allwinner ClassA20类库分析】 2.free pascal语法及结构简析

        上一节介绍了Lazarus一般的开发操作流程,对于不熟悉pascal语言的朋友可能看的还是不大明确.不知道pascal代码里都应该包括什么或起什么作用.这回就简单地介绍下语法及代码文件的结构. ...

  9. Android自己定义矩形及selector、shape的使用

    [声明]转载请注明出处.此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --每天写一篇博客.每天做一点技术积累! Android自己定义矩形及selector ...

  10. Eclipse 更新Android SDK后,新建项目出现appcompat_v7project的相关问题

    Eclipse 更新Android SDK后,新建项目出现各种问题.网上各种解决方式,搞了好久,总结一下. 1.出现error: Error retrieving parent for item: N ...