【线段树】bzoj3585: mex
非常精妙的线段树题
Description
有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。
Input
第一行n,m。
第二行为n个数。
从第三行开始,每行一个询问l,r。
Output
一行一个数,表示每个询问的答案。
Sample Input
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5
Sample Output
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的更多相关文章
- 【bzoj3585】mex 线段树 mex,sg
Description 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树
Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...
- HDU-4747 Mex(线段树区间更新)
题目大意:给一个长度为n的整数序列,定义mex(i,j)表示区间[i,j]中没有出现过的最小非负整数,求sigma(mex(i,j)),即序列中所有连续非空子区间的mex之和. 题目分析: answe ...
- HDU-4747 Mex 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:求一个数列中,所有mex(L,R)的和. 注意到mex是单调不降的,那么首先预处理出mex ...
- [置顶] hdu4747 Mex 线段树
题意:给你一个序列,让你求出对于所有区间<i, j>的mex和,mex表示该区间没有出现过的最小的整数. 思路:从时限和点数就可以看出是线段树,并且我们可以枚举左端点i, 然后求出所有左端 ...
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- BZOJ.3585.mex(线段树)
题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么 ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
随机推荐
- 基础篇-环境变量 .bash_profile
千里之行始于足下~~~ PGHOST或者PGHOSTADDR PGPORT PGDATABASE PGUSER PGPASSWORD(不推荐使用这个,推荐使用.pgpass)
- 多次页面跳转后pop回主界面的问题
最近写代码的时候出了点BUG, 查阅资料后终于解决了. 问题原因大概是: 项目中所有的viewController都是继承自一个封装好的viewController. navigationbar, n ...
- linux模拟http请求命令
Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求.下面就来介绍一下Linux系统如何模拟Http ...
- StringUitl工具类中的一种写法
typeHandlersPackageArray = StringUtils.tokenizeToStringArray(this.typeAliasesPackage, ",; \t\n& ...
- E - Round Numbers
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...
- 归档-对模型数组对象(存储到本地的plist文件)也数组里存放的是模型
一.模型文件 (1)JLMainViewsModel.h文件 必须遵循 NSCoding协议 @interface JLMainViewsModel : NSObject<NSCopying,N ...
- python-函数进阶-动态传参,名称空间,作用域的问题
一.函数的动态的动态参数 动态参数分为两种:动态接收位置参数.动态接收关键字参数. 1.*args 位置参数动态传参 # 顺序: 位置参数=>*args(arguments) => 默认 ...
- IIS7文件无法下载问题处理
使用IIS建立了静态站点,内部放置了一些文件供内部局域网下载使用,但deb等文件格式无法下载. 解决办法: 1.在IIS管理器中点击站点,选择右侧的MIME类型. 2.在MIME类型中添加需要下载文件 ...
- python学习之字符编码
字符串涉及到编码:ascii gbk gb2312 unicode uft-8 对于英文字符ASCII(可以看成utf-8的子集)就可以了,中文用gbk/gb2312; unicode:世界统一(兼容 ...
- js获取窗口参数
window.onscroll=function getScrollTop(){ console.log(scrollTop) if(document.documentElement&& ...