Description

  有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

Input

  第一行n,m。
第二行为n个数。
从第三行开始,每行一个询问l,r。

Output

  一行一个数,表示每个询问的答案。

Sample Input

5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5

Sample Output

1
2
3
0
3

HINT

数据规模和约定
对于100%的数据:
1<=n,m<=200000
0<=ai<=109
1<=l<=r<=n

对于30%的数据:

1<=n,m<=1000

离线瞎XX乱搞,只需要先处理出前缀的sg,表示最小没出现的自然数,然后就是

根据影响范围搞线段树即可

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring> #define inf 0x7fffffff
using namespace std;
inline int read()
{
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
} int n,m,cnt,k=;
int a[],b[],sg[],ans[],next[],last[];
int ls[],rs[],mn[];
bool mark[]; struct data{int l,r,id;}q[];
bool cmp(data a,data b)
{return a.l<b.l;}
int find(int x)
{
int l=,r=cnt;
while(l<=r)
{
int mid=(l+r)>>;
if(b[mid]<x)l=mid+;
else r=mid-;
}
return l;
}
void build(int k,int l,int r)
{
ls[k]=l;rs[k]=r;mn[k]=inf;
if(l==r){mn[k]=sg[l];return;}
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
}
void pushdown(int k)
{
int l=ls[k],r=rs[k];
if(l==r)return;
mn[k<<]=min(mn[k],mn[k<<]);
mn[k<<|]=min(mn[k],mn[k<<|]);
}
int ask(int k,int x)
{
if(mn[k]!=inf)pushdown(k);
int l=ls[k],r=rs[k];
if(l==r)return mn[k];
int mid=(l+r)>>;
if(x<=mid)return ask(k<<,x);
return ask(k<<|,x);
}
void update(int k,int x,int y,int val)
{
if(mn[k]!=inf)pushdown(k);
int l=ls[k],r=rs[k];
if(l==x&&y==r){mn[k]=min(mn[k],val);return;}
int mid=(l+r)>>;
if(y<=mid)update(k<<,x,y,val);
else if(x>mid)update(k<<|,x,y,val);
else {update(k<<,x,mid,val);update(k<<|,mid+,y,val);}
}
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
a[i]=b[i]=read();
sort(b+,b+n+);
for(int i=;i<=n;i++)
if(b[i]!=b[i-]||i==)b[++cnt]=b[i];
for(int i=;i<=n;i++)
{
int t=find(a[i]);
mark[t]=;
if(a[i]==k)
while(mark[t])
{
k++;
if(b[++t]!=k)break;
}
sg[i]=k;
}
build(,,n);
for(int i=n;i>;i--)
next[i]=last[find(a[i])],last[find(a[i])]=i;
/*for (int i=1;i<=n;i++)
cout<<next[i]<<" ";
cout<<endl;
for (int i=1;i<=n;i++)
cout<<last[i]<<" ";
cout<<endl;*/
for(int i=;i<=m;i++)
{
q[i].l=read();q[i].r=read();
q[i].id=i;
}
sort(q+,q+m+,cmp);
int now=;
for(int i=;i<=m;i++)
{
while(now<q[i].l)
{
if(!next[now])next[now]=n+;
update(,now,next[now]-,a[now]);
now++;
}
ans[q[i].id]=ask(,q[i].r);
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}

【bzoj3585】mex 线段树 mex,sg的更多相关文章

  1. HDU-4747 Mex 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:求一个数列中,所有mex(L,R)的和. 注意到mex是单调不降的,那么首先预处理出mex ...

  2. [置顶] hdu4747 Mex 线段树

    题意:给你一个序列,让你求出对于所有区间<i, j>的mex和,mex表示该区间没有出现过的最小的整数. 思路:从时限和点数就可以看出是线段树,并且我们可以枚举左端点i, 然后求出所有左端 ...

  3. BZOJ.3585.mex(线段树)

    题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么 ...

  4. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  5. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

  6. BZOJ 3339 Rmq Problem(离线+线段树+mex函数)

    题意: q次询问,问[l,r]子区间的mex值 思路: 对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减 对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r] ...

  7. Codeforces 1083C Max Mex [线段树]

    洛谷 Codeforces 思路 很容易发现答案满足单调性,可以二分答案. 接下来询问就转换成判断前缀点集是否能组成一条链. 我最初的想法:找到点集的直径,判断直径是否覆盖了所有点,需要用到树套树,复 ...

  8. [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树

    Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...

  9. CF1083C Max Mex 线段树

    题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么 ...

随机推荐

  1. C# 文件操作概述

    微软的.Net框架为我们提供了基于流的I/O操作方式,这样就大大简化了开发者的工作.因为我们可以对一系列的通用对象进行操作,而不必关心该I/O操作是和本机的文件有关还是和网络中的数据有关..Net框架 ...

  2. Load事件中控件Focus()无效解决办法

    原因:Load窗体时,窗体未显示 解决:1.Focus()之前添加this.Show(); 2.在Shown事件中添加Focus()

  3. 关于HTML(含HTML5)的块级元素和行级(内联)元素总结

    1.首先我们要知道什么是块级元素和行级(内联)元素? 块级(block)元素的特点: ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度: ...

  4. vue watch深度监听对象,实现数据联动

    当对象内的某一个元素发生变化,判断对象另一元素,并进行赋值 <template> <input type="text" v-model="a.a1.a1 ...

  5. cf550D. Regular Bridge(构造)

    题意 给出一个$k$,构造一个无向图,使得每个点的度数为$k$,且存在一个桥 Sol 神仙题 一篇写的非常好的博客:http://www.cnblogs.com/mangoyang/p/9302269 ...

  6. mysql 绿色版 安装

    1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...

  7. 精通Spring Boot---使用@ControllerAdvice处理异常

    在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...

  8. Flask初学者:g对象,hook钩子函数

    Flask的g对象 作用:g可以可以看作是单词global的缩写,使用“from flask import g”导入,g对象的作用是保存一些在一次请求中多个地方的都需要用到的数据,这些数据可能在用到的 ...

  9. stark组件前戏(2)之单例模式

    单,一个. 例,实例.对象. 通过利用Python模块导入的特性:在Python中,如果已经导入过的文件再被重新导入时候,python不会重新解释一遍,而是选择从内容中直接将原来导入的值拿来用.   ...

  10. stm32-IIC读写EEPROM—时序说明

    I2C 通讯协议:(Inter-Integrated Circuit)是由Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART.CAN  等通讯协议的外部收发设备,现在 ...