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个人分数比我低.”问最少有几个人没有说真话( ...
随机推荐
- 最新idea注册激活(永久使用,亲测可用)
IDEA破解 一.2018版本 首先下载此破解jar包:破解jar包,将其放到合适的文件夹(首选IDEA的同级目录)进行管理: 进入IDEA的根目录,打开bin文件夹中的idea.exe.vmopti ...
- FastJSON将Java对象转为json,日期显示时间戳未格式化解决办法
JSON版本:FastJson Java 对象转换为 JSON 格式 定义以下 Person JavaBean: public class Person { @JSONField(name = &qu ...
- C#反射与特性(六):设计一个仿ASP.NETCore依赖注入Web
目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...
- asp.net core 3.x 通用主机是如何承载asp.net core的-上
一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...
- 基于bootstrap的下拉选择 ( combox ) 输入 ( input ) 功能
需求: 在编辑数据的时候,既可以让用户输入,也可以从下拉框中选择 思路: 参照下面的效果图,因为是表格里面的数据,所以下拉框触发按钮和输入框分别为1列,输入列可以设置是否输入(方法:<td co ...
- Redis系列之----Redis的两种持久化机制(RDB和AOF)
Redis的两种持久化机制(RDB和AOF) 什么是持久化 Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望 ...
- Map2Shp软件字符编码解决方案——彻底杜绝Shape格式乱码
在使用Shape文件时,如果里面有中文属性信息时,经常会遇到属性信息变为乱码.尤其是ArcGIS10.2.1之后,Esri改变了软件的默认字符编码规则,打开之前保存的Shapefile文件,总会不时遇 ...
- 什么样的项目适合docker部署,docker应用场景
docker官网上说明了docker的典型场景: 使应用的打包与部署自动化 创建轻量.私密的PAAS环境 实现自动化测试和持续的集成/部署 根据这些特性,我们可以想象一下,如果你的项目有如下痛点或者需 ...
- python列表(数组)
列表(list) 就是 数组 - 列表是Python中的一个对象 - 对象(object)就是内存中专门用来存储数据的一块区域 - 之前我们学习的对象,像数值,它只能保存一个单一的数据 - 列表中可 ...
- java类中元素初始化顺序
结论:对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. public class Test4 { @Tes ...