BZOJ 3339 Rmq Problem(离线+线段树+mex函数)
题意:
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函数)的更多相关文章
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- BZOJ 3339: Rmq Problem 莫队算法
3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...
- BZOJ 3339: Rmq Problem
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1075 Solved: 549[Submit][Status][ ...
- [BZOJ3339] Rmq Problem(线段树)
传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...
- bzoj 3339 Rmq Problem / mex
题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...
- BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)
BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- bzoj2333 离线 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...
- BZOJ_2298_[HAOI2011]problem a_线段树
BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...
随机推荐
- Jpa自定义查询报错(Failed to convert from type [java.lang.Object[]] to type)
Jpa自定义查询报错 问题背景 今天遇到一个奇怪的报错"Failed to convert from type [java.lang.Object[]] to type",这个报错 ...
- EXE和DLL调用关系,DLL制作,钩子
制作DLL时,在cpp种引入了头文件,但头文件里的全局变量在cpp种却不能用 参考大佬博客https://blog.csdn.net/speargod/article/details/88854344 ...
- 关于AWD线下攻防的经验
备份: 1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp, 找到根目录后,直接右键后台下载就行. 找根目录这里,有时候比赛不给根目录位置,上次 ...
- 我该如何学习spring源码以及解析bean定义的注册
如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...
- maven中scope标签各个值的意义
在使用maven配置时,有时候会见到scope这个标签,但是总是记不住他们所对应的含义,现在整理一下,以后忘记了再来查看. 版权声明:本文为CSDN博主「MrZhangBaby」的原创文章,遵循 CC ...
- ECOS问题解决记录
1.finder自定义列 http://club.ec-os.net/doc/ecos/framework-ecos/advance/desktop/dev.html#id5 2.命令行工具 地址 h ...
- gcd竞赛模板
int gcd(int a,int b) { ) return a; return gcd(b,a%b); }
- Python3 正则表达式 re 模块的使用 - 学习笔记
re 模块的引入 re 模块的使用 re.compile() re.match()与re.search() re.match re.search() 区别 re.findall()与re.findit ...
- Linux 系统常用管理命令(精简笔记)
Linux是一套免费使用和自由传播的类Unix操作系统,下面的笔记是我从鸟菜中摘抄出来的重要命令,并进行了一定的排版,摒弃了一些用不到的乱七八糟的命令,目的是在生产环境中能够快速的定位并查询需要命令的 ...
- Git提交代码和更新代码命令
微信公众号:非科班的科班关注可了解更多的java教程和其它资源视频.问题或建议,请公众号留言; 1.Git提交代码 利用命令提交代码的步骤:1.1.拉取服务器代码,避免覆盖他人的代码 git pull ...