题意:

q次询问,问[l,r]子区间的mex值

思路:

对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减

对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r]的mex

l每增大1,都要更新[l, next[l]-1],将这个区间内大于a[l]的值更新为a[l]

其中next[i]为i之后的下一个a[i]位置

代码:

线段树写的不熟。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
//#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 2e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f; const db pi = acos(-1.0); int a[maxn];
int n, q;
int nx[maxn];
int lst[maxn];
struct node{
int l, r;
int id;
}b[maxn];
bool cmp(node a, node b){
return a.l<b.l;
}
int mex[maxn];
set<int>s;
int dat[maxn];
void build(int l, int r, int root){
int mid = (l+r)>>;
if(l==r){
dat[root] = mex[l];
return;
}
dat[root] = inf;
build(lson);
build(rson);
return;
}
void pushdown(int l, int r, int root){
if(l==r)return;
dat[lc]=min(dat[lc],dat[root]);
dat[rc]=min(dat[rc],dat[root]);
return;
}
int ask(int x, int l, int r, int root){
if(dat[root]!=inf)pushdown(l, r, root);
if(l==r)return dat[root];
int mid = (l+r)>>;
if(x<=mid)return ask(x,lson);
return ask(x,rson);
}
void update(int x, int y, int val, int l, int r, int root){
if(dat[root]!=inf)pushdown(l,r,root);
if(l==x&&y==r){
dat[root]=min(dat[root],val);return;
}
int mid = (l+r)>>;
if(y<=mid)update(x,y,val,lson);
else if(x>mid)update(x,y,val,rson);
else{
update(x,mid,val,lson);
update(mid+,y,val,rson);
}
return;
}
int ans[maxn];
int main(){
scanf("%d %d", &n, &q);
for(int i = ; i <= n; i++){
nx[i]=n+;
}
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
if(lst[a[i]]){
nx[lst[a[i]]]=i;
}
lst[a[i]]=i;
}
int tmp = ; for(int i = ; i <= n; i++){
s.insert(a[i]);
while(s.find(tmp)!=s.end()){
tmp++;
}
mex[i]=tmp;
}build(,n,);
for(int i = ; i <= q; i++){b[i].id=i;
scanf("%d %d", &b[i].l, &b[i].r);
}
sort(b+,b++q,cmp);
int p = ;
for(int i = ; i <= q; i++){
while(p<b[i].l){
//printf("\\\\%d\n",p);
update(p,nx[p]-,a[p],,n,);
//printf("---\n");
p++;
}
//printf("==%d %d %d\n",b[i].id,b[i].l,b[i].r);
//printf("--%d %d\n",i,ask(b[i].r,1,n,1));
ans[b[i].id]=ask(b[i].r,,n,);
}
for(int i = ; i <= q; i++){
printf("%d\n",ans[i]);
}
return ;
} /*
7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
*/

BZOJ 3339 Rmq Problem(离线+线段树+mex函数)的更多相关文章

  1. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  2. BZOJ 3339: Rmq Problem 莫队算法

    3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...

  3. BZOJ 3339: Rmq Problem

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1075  Solved: 549[Submit][Status][ ...

  4. [BZOJ3339] Rmq Problem(线段树)

    传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...

  5. bzoj 3339 Rmq Problem / mex

    题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...

  6. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  7. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  9. BZOJ_2298_[HAOI2011]problem a_线段树

    BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...

随机推荐

  1. 在EasyUI项目中使用FileBox控件实现文件上传处理

    我在较早之前的随笔<基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用>Web框架介绍中介绍了基于Uploadify的文件上传操作,免费版本用的是J ...

  2. ENS使用指南系列之一 [ 注册 .eth 域名详细教程 ]

    ENS 域名系统中目前支持三种顶级域名,分别是 .eth .xyz .luxe.其中, .eth 是 ENS 系统的原生域名,是由一系列智能合约控制的去中心化的域名,另外两种是从互联网域名中接入的,要 ...

  3. js面试题之手写节流函数和防抖函数

    函数节流:不断触发一个函数后,执行第一次,只有大于设定的执行周期后才会执行第二次 /* 节流函数:fn:要被节流的函数,delay:规定的时间 */ function throttle(fn,dela ...

  4. ThinkPHP5——接入腾讯云短信API

    接入腾讯云短信API相当简单,最重要的是第一次使用腾讯云短信的话有100条免费短信可以测试,对于开发人员是足够了,下面我就教大家接入腾讯云短信. 第一步:准备工作 首先要在腾讯云短信申请短信签名与短信 ...

  5. Git 合并多次提交

    在合并分支的时候,希望将多次提交合并成一个,然后再 cherry-pick 到主分支. 合并分支 develop 分支做开发,可能会进行多次提交,但是在发布或者进行 PR 的时候,我们只希望看到一次提 ...

  6. Redis入门--1.安装Redis

    redis是什么? 是完全开源免费的,用c语言编写的,是一个单线程,高性能的(key/value)内存数据库,基于内存运行并支持持久化的nosql数据库 redis能干嘛? 主要是用来做缓存,但不仅仅 ...

  7. 浏览器应用集成嵌入WPS指南

    因为该WPS插件使用NPAPI机制来和浏览器交互,故要求使用插件的浏览器必须支持NPAPI机制且必须开启NPAPI机制. 以下是支持的常见的浏览器及其版本: FireFox浏览器52及小于52的版本( ...

  8. MySQL UTF-8 常用字符排序规则

    排序规则 解释 utf8_general_ci 不区分大小写 utf8_general_cs 区分大小写 utf8_bin 区分大小写,字符串每个字符串用二进制数据编译存储,且支持存储二进制数据

  9. fill 的用法

    博客 : http://blog.csdn.net/liuchuo/article/details/52296646 fill函数的作用是:将一个区间的元素都赋予val值.函数参数:fill(vec. ...

  10. postman的测试,用对象接收所有的字符串

    1.post请求 Headers: Content-Type  application/json { "taskId":"1000001161", " ...