题目

我的树状数组怎么那么慢啊

就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算

显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\),或者\(j>r\)且\(lst_j<l\),这样的\(a_j\)才能被计算到

发现这不就是一个数点吗,于是我们扫描线加灵活的树状数组就做完了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define lb(i) ((i)&(-i))
#define getchar() (S==T&&(T=(S=BB)+fread(BB,1,1<<15,stdin),S==T)?EOF:*S++)
char BB[1<<18],*S = BB,*T=BB;
const int maxn=200005;
const int inf=999999999;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct Ask{int l,r,rk;}q[maxn];
int n,m,ans,sz;
inline int min(int a,int b) {return a<b?a:b;}
int a[maxn],lst[maxn],nxt[maxn],Ans[maxn],ma[maxn],pos[maxn],c[maxn],d[maxn];
inline int cmp(Ask A,Ask B) {return A.l<B.l;}
inline int cop(Ask A,Ask B) {return A.r>B.r;}
inline void change(int x,int val) {for(re int i=x;i;i-=lb(i)) d[i]=min(d[i],val);}
inline void add(int x,int val) {for(re int i=x;i<=n+1;i+=lb(i)) d[i]=min(d[i],val);}
inline int ask(int x) {int now=inf,i;for(i=x;i;i-=lb(i)) now=min(now,d[i]);return now;}
inline int query(int x) {int now=inf,i;x++;for(i=x;i<=n+1;i+=lb(i)) now=min(now,d[i]);return now;}
inline void work() {
ans=inf;
if(c[1]!=0) {ans=0;return;}
for(re int i=2;i<=sz;i++) {
if(c[i]!=c[i-1]+1) {ans=c[i-1]+1;return;}
}
ans=c[sz]+1;
}
inline int find(int x) {
int l=1,r=sz;
while(l<=r) {
int mid=l+r>>1;if(c[mid]==x) return mid;
if(c[mid]<x) l=mid+1;else r=mid-1;
}
return 0;
}
int main() {
n=read(),m=read();
for(re int i=1;i<=n;i++) c[i]=a[i]=read();
std::sort(c+1,c+n+1);sz=std::unique(c+1,c+n+1)-c-1;
for(re int i=n;i;--i) {
pos[i]=find(a[i]);
nxt[i]=ma[pos[i]],ma[pos[i]]=i;
}
memset(ma,0,sizeof(ma));
for(re int i=1;i<=n;i++) lst[i]=ma[pos[i]],ma[pos[i]]=i;
for(re int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].rk=i;
for(re int i=1;i<=n;i++) if(!nxt[i]) nxt[i]=n+1;
std::sort(q+1,q+m+1,cmp);
for(re int i=1;i<=n+1;i++) d[i]=inf;
for(re int i=1;i<=m;i++) Ans[i]=inf;
int now=1;
for(re int i=1;i<=m;i++) {
while(now<q[i].l) {change(nxt[now],a[now]);now++;}
Ans[q[i].rk]=min(Ans[q[i].rk],query(q[i].r));
}
for(re int i=1;i<=n;i++) d[i]=inf;
std::sort(q+1,q+m+1,cop);
now=n;
for(re int i=1;i<=m;i++) {
while(now>q[i].r) {add(lst[now]+1,a[now]);now--;}
Ans[q[i].rk]=min(Ans[q[i].rk],ask(q[i].l));
}
work();
for(re int i=1;i<=m;i++) printf("%d\n",min(Ans[i],ans));
return 0;
}

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. BZOJ 3339 Rmq Problem(离线+线段树+mex函数)

    题意: q次询问,问[l,r]子区间的mex值 思路: 对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减 对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r] ...

  5. BZOJ 3339 && luogu4137 Rmq Problem / mex(莫队)

    P4137 Rmq Problem / mex 题目描述 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. ...

  6. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  7. [bzoj3585] Rmq Problem / mex

    [bzoj3585] Rmq Problem / mex bzoj luogu 看上一篇博客吧,看完了这个也顺理成章会了( (没错这篇博客就是这么水) #include<cstdio> # ...

  8. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

  9. P4137 Rmq Problem / mex (莫队)

    题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...

随机推荐

  1. SQL Serever学习15——进阶

    特别说明:在sqlserver2014中,不区分大小写,也就是说,SQL是大小写不敏感的 数据库模型3类: 层次模型 网状模型 关系模型 关系型数据库语言3种: DDL数据定义语言 CREATE(创建 ...

  2. 九、双端队列LinkedBlockDeque

    一.简介 JDK通过BlockQueue阻塞队列实现了生产者-消费者模式,生产者向队列添加数据,消费者从队列里面消费数据. 但是在有些场景里面,我们是无法区分生产者消费者的,或者说既是生产者,也是消费 ...

  3. 从Eclipse切换到IDEA工具,哎~真香!

    从Eclipse切换到IDEA工具,哎~真香!(图) 个人观点:IDEA工具用了就回不去了!!!对比很多人写,我就不赘述了.我在这里主要介绍一下IDEA工具的一些使用上的技巧,毕竟我开始学习java的 ...

  4. Java 的 委托 是什么?

    前言:在学习设计模式时,发现书中有多次提到委托二字,所以经过网上搜索得到结果,并自己写了个小小的例子. 什么是委托? 委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求 ...

  5. eclipse中实现文本换行

    Eclipse 使用系统内置的“ Text Editor ”做为文本编辑器,这个文本编辑器有一个问题,就是文本无法换行. 扩展插件 WordWrap 可以实现文本换行         安装方法:    ...

  6. C# Task.FromResult的用法

    Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法比如有一个接口包含异步方法. interface IMyInterface { Tas ...

  7. laravel开发之-安装laravel-admin

    1.输入命令:composer require encore/laravel-admin "1.4.*" 2.在config/app.php中添加 :Encore\Admin\Pr ...

  8. 前端把html表格生成为excel表格

    最近公司改后台管理系统.要求导出台账项目等等为excel表格,找半天还真有,他是通过query.table2excel.js 实现,原谅我原生不会弄这个当然大家有可以给我留言. <!DOCTYP ...

  9. <Android 应用 之路> MPAndroidChart~BubbleChart(气泡图) and RadarChart(雷达图)

    简介 MPAndroidChart是PhilJay大神给Android开发者带来的福利.MPAndroidChart是一个功能强大并且使用灵活的图表开源库,支持Android和iOS两种,这里我们暂时 ...

  10. 插入外置网卡端口顺序混乱--linux系统

    本文皆是作者工作学习中的理解或感悟,欢迎大家提出问题,一起讨论!! 一.问题提出 一般的主板上都带有两个网卡接口,linux系统启动后一般命名为eth0,eth1,当然如果我们不对eth0与eth1进 ...