非常精妙的线段树题

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. CSS优先级、CSS选择器、编写CSS时的注意事项

    CSS的优先级: 内嵌样式>ID选择器>类选择器>标签选择器 内部样式>内部样式>外部样式 CSS的选择器: 选择器:在 CSS 中,选择器是一种模式,用于选择需要添加样 ...

  2. Java 虚拟机(Java Virtual Machine)

    Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode).字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 J ...

  3. django框架知识3

    1.Django安装: 1.安装版本Django1.11.11 2.安装方式:命令行安装   pycharm安装 2.创建Django项目 1.创建方式:cd到你要创建的目录下  然后输入 Djang ...

  4. 【NOIP模拟】序列

    [问题描述] 一个序列被称为有趣的序列是它的所有的子串拥有一个唯一的整数(这个整数在整个序列中只出现过一次).给你一个序列的整数, 问你它是否是有趣的. [输入格式] 第一行 T, 表示数据组数.接下 ...

  5. Spring security + oauth2.0 + redis + mybatis plus 搭建微服务

    上个星期一个朋友请求帮忙,让我搭建一个分布式授权中心的微服务,之前我也没搭建过,在网上撸了几天前辈们写的技术博客,搞出个模型,分享给大家: 前辈们博客地址: OAuth2.0 原理:https://b ...

  6. Codeforces Round #390 (Div. 2) A

    One spring day on his way to university Lesha found an array A. Lesha likes to split arrays into sev ...

  7. 洛谷 P1031 均分纸牌

    P1031 均分纸牌 这道题告诉我们,对于实在想不出算法的题,可以大胆按照直觉用贪心,而且在考试中永远不要试着去证明贪心算法,因为非常难证,会浪费大量时间. (这就是你们都不去证的理由??) 这道题贪 ...

  8. D - 連結 / Connectivity 并查集

    http://abc049.contest.atcoder.jp/tasks/arc065_b 一开始做这题的时候,就直接蒙逼了,n是2e5,如果真的要算出每一个节点u能否到达任意一个节点i,这不是f ...

  9. js验证textarea里面是否有换行符

    var reg = /[\r\n]+/g;if(reg.test(reason)){ PopAlert("不能有换行符!"); return;}

  10. [转]Cordova android框架详解

    本文转自:http://www.cnblogs.com/hubcarl/p/4202784.html 一.Cordova 核心java类说明 CordovaActivity:Cordova Activ ...