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. Django之视图和URL配置

    1.在创建项目时,Django会自动创建URL配置,在urls.py文件中 文件的默认内容如下所示: """mysite URL Configuration The ur ...

  2. 第三篇:彻底解决ssh.invoke_shell() 返回的中文问题

    接上一篇,前两篇解决中文的问题主要是在字符集上做的手脚,即将中文转成英文,但是有一种情况我们都来不及做转换,即登录时服务器直接返回了中文内容: 此时程序报了如下错误,其实还是字符集问题: 为此:我们可 ...

  3. 利用Filter解决跨域请求的问题

    1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...

  4. JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

    3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms  Mem ...

  5. spark和MR比较

    MapReduce: 分布式的计算框架 缺点:执行速度慢 IO瓶颈 ==> 磁盘IO 网络IO shuffle机制:数据需要输出到磁盘,而且每次shuffle都需要进行排序操作 框架的机制: 只 ...

  6. 解决cmd目录下pip命令不存在的问题

    解决cmd目录下pip命令不存在的问题 注:pip.exe程序在Python安装目录下的scripts中1.在cmd命令中输入: 先输入:python -m ensurepip 再输入:python ...

  7. Python9-前端基础知识-day47

    web开发本质: 1.浏览器输入网址回车都发生了什么? 1.浏览器给服务端发送一个消息 2.服务端拿到消息 3.服务端返回消息 4.浏览器展示页面C/S架构----B/S架构客户端和服务端 消息的格式 ...

  8. 748. Shortest Completing Word

    https://leetcode.com/problems/shortest-completing-word/description/ class Solution { public: string ...

  9. SHIWEITI

    //Wannafly挑战赛19(牛客网) //A 队列Q #include <iostream> #include <cstdio> #include <cstring& ...

  10. 关于IDEA 单元测试时 【empty test suite】异常的分析!!

    IDEA功能很强大,配置很操蛋,自从用了之后掉了很多坑!!! 这几天要用单元测试,方法完好但是就是一直报empty test suite ,WTF,类找不到 在网上反复的找答案都没有合适 静下心想想, ...