非常精妙的线段树题

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


题目分析

细节很精妙

 #include<bits/stdc++.h>
const int maxn = ;
const int INF = 2e9; struct QRs
{
int l,r,id;
bool operator < (QRs a) const
{
return l < a.l||(l==a.l&&r < a.r);
}
}q[maxn];
int n,m,tt,now;
int a[maxn],b[maxn],mn[maxn<<];
int hsh[maxn],sgVal[maxn],ans[maxn];
int nxt[maxn],lst[maxn]; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
void pushdown(int x)
{
mn[x<<] = std::min(mn[x<<], mn[x]);
mn[x<<|] = std::min(mn[x<<|], mn[x]);
}
void build(int rt, int l, int r)
{
mn[rt] = INF;
if (l==r){
mn[rt] = sgVal[l];
return;
}
int mid = (l+r)>>;
build(rt<<, l, mid), build(rt<<|, mid+, r);
}
int query(int rt, int l, int r, int pos)
{
if (l==r) return mn[rt];
int mid = (l+r)>>;
pushdown(rt);
if (pos <= mid) return query(rt<<, l, mid, pos);
return query(rt<<|, mid+, r, pos);
}
void update(int rt, int L, int R, int l, int r, int c)
{
if (L <= l&&r <= R){
mn[rt] = std::min(mn[rt], c);
return;
}
int mid = (l+r)>>;
pushdown(rt);
if (L <= mid) update(rt<<, L, R, l, mid, c);
if (R > mid) update(rt<<|, L, R, mid+, r, c);
}
int main()
{
n = read(), m = read(), tt = ;
for (int i=; i<=n; i++)
{
a[i] = read();
if (a[i] > n) a[i] = n+;
}
for (int i=; i<=m; i++)
q[i].l = read(), q[i].r = read(), q[i].id = i;
std::sort(q+, q+m+);
for (int i=; i<=n; i++)
{
hsh[a[i]] = ;
if (a[i]==tt)
while (hsh[tt]) tt++;
sgVal[i] = tt;
}
for (int i=n; i>=; i--)
{
tt = a[i];
nxt[i] = lst[tt], lst[tt] = i;
}
build(, , n);
now = ;
for (int i=; i<=m; i++)
{
for (; now < q[i].l; now++)
{
if (!nxt[now]) nxt[now] = n+;
update(, now, nxt[now]-, , n, a[now]);
}
ans[q[i].id] = query(, , n, q[i].r);
}
for (int i=; i<=m; i++)
printf("%d\n",ans[i]);
return ;
}

END

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

  1. 【bzoj3585】mex 线段树 mex,sg

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

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

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

  3. HDU-4747 Mex(线段树区间更新)

    题目大意:给一个长度为n的整数序列,定义mex(i,j)表示区间[i,j]中没有出现过的最小非负整数,求sigma(mex(i,j)),即序列中所有连续非空子区间的mex之和. 题目分析: answe ...

  4. HDU-4747 Mex 线段树

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

  5. [置顶] hdu4747 Mex 线段树

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

  6. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

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

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

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

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

  9. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

随机推荐

  1. 实现easyui combobox中textField字段的拼接

    开发过程中遇到这样的一个需求: 从后台得到的两个字段aa.bb拼接为一个字段aabb显示在easyui combobx的下拉选项中. 实现方法: 利用formatter属性定义如何呈现行: 页面代码: ...

  2. eclipse svn 相关

    eclipse本身带有cvs插件,我们也可以在eclipse里面加上svn插件,请参考eclipse安装svn插件,以及使用,但是在eclipse的左边栏,.svn,.cvs的文件会显示出来,目录拉的 ...

  3. python如何用pip安装模块

    pip去python官网下载 我想写的是安装后怎么做,假设我们要安装pymysql模块 在python交互式模式中运行pip install pymysql 会抛出 语法错误,不知为何. 此时应该找到 ...

  4. java操作rabbitmq实现简单的消息发送(socket编程的升级)

    准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...

  5. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  6. hdu 3686 Traffic Real Time Query System 点双两通分量 + LCA。这题有重边!!!

    http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能 ...

  7. auth_basic 认证

    shell > yum -y install httpd-tools # 安装 htpasswd 工具 shell > cd /usr/local/nginx-/conf shell &g ...

  8. js如何调用电脑的摄像头

    闲来无事,用js写了一个调用摄像头的demo,并用canvas显示保存.这个功能很实用,比如上传用户的头像,即时拍照及时上传. Html: <video width="200px&qu ...

  9. Sencha Touch和jQuery Mobile的比较

    第一组-行销和平台支持 Sencha Touch和jQuery Mobile都以HTML5框架著称.jQuery Mobile谦虚的说自己只是内建于所有流行的移动设备平台,而Sencha Touch则 ...

  10. js 字符串常用操作

    function Class_String_Common(){ //将字符串 myString 的 start位置 和 end位置 之间的内容替换为 replaceStr this.replace1 ...