【bzoj3339】Rmq Problem

 

Description

Input

Output

Sample Input

7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7

Sample Output

3
0
3
2
4

HINT

分析

离线算法。

对于[l,r]区间的询问,我们可以线性求出来,然后考虑[l,r]与[l+1,r]区间有什么不同,在a[l]下一次出现的位置之前,所有大于a[l]的mex,都变成是a[l],因为 [l+1,a[l]下一次出现的位置-1],这个区间内没有a[l]了,大于它的数当然可以是它。

所以将询问的先按左端点排序,然后递增左端点,不断更新,用线段树维护。

code

 #include<cstdio>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 using namespace std; const int MAXN = ;
const int INF = 1e9; struct Que{
int l,r,id;
bool operator < (const Que &x) const
{
return l < x.l;
}
}q[MAXN];
int a[MAXN],sg[MAXN],mn[MAXN<<];
int next[MAXN],last[MAXN],ans[MAXN];
bool vis[MAXN];
int n,m,k = ,now; int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'') {ch=getchar(); }
while(ch>=''&&ch<='') {x=x*+ch-''; ch=getchar(); }
return x;
}
void pushdown(int rt)
{
if (mn[rt]!=INF)
{
mn[rt<<] = min(mn[rt],mn[rt<<]);
mn[rt<<|] = min(mn[rt],mn[rt<<|]);
}
}
void build(int l,int r,int rt)
{
mn[rt] = INF;
if (l==r)
{
mn[rt] = sg[l];
return ;
}
int m = (l+r)>>;
build(lson);
build(rson);
}
void update(int l,int r,int rt,int L,int R,int v)
{
if (L<=l&&r<=R)
{
mn[rt] = min(mn[rt],v);
return ;
}
pushdown(rt);
int m = (l+r)>>;
if (L<=m) update(lson,L,R,v);
if (R>m) update(rson,L,R,v);
}
int query(int l,int r,int rt,int p)
{
if (l==r) return mn[rt];
pushdown(rt);
int m = (l+r)>>;
if (p<=m) return query(lson,p);
else return query(rson,p);
} int main()
{
n = read();m = read();
for (int i=; i<=n; ++i)
a[i] = read();
for (int i=;i<=m; ++i)
q[i].l = read(), q[i].r = read(), q[i].id = i;
sort(q+,q+m+);
for (int i=; i<=n; ++i)
{
vis[a[i]] = true;
while (vis[k]) k++;
sg[i] = k;
}
build(,n,);
for (int i=n; i; --i)
next[i] = last[a[i]], last[a[i]] = i;
now = ; for (int i=; i<=m; ++i)
{
while (now<q[i].l)
{
if (!next[now]) next[now] = n+;
update(,n,,now,next[now]-,a[now]);
now++;
}
ans[q[i].id] = query(,n,,q[i].r);
}
for (int i=; i<=m; ++i)
printf("%d\n",ans[i]);
return ;
}

(……)

【bzoj3339】Rmq Problem的更多相关文章

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

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

  2. 【BZOJ】【3339】Rmq Problem

    离线+线段树 Orz Hzwer,引用题解: 这一题在线似乎比较麻烦 至于离线.. 首先按照左端点将询问排序 然后一般可以这样考虑 首先如何得到1-i的sg值呢 这个可以一开始扫一遍完成 接着考虑l- ...

  3. 【luogu4137】 Rmq Problem / mex - 莫队

    题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 思路 莫队水过去了 233 #include <bits/stdc++.h> ...

  4. 【BZOJ2302】[HAOI2011]Problem C(动态规划)

    [BZOJ2302][HAOI2011]Problem C(动态规划) 题面 BZOJ 洛谷 题解 首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的. 然而这题也有属于这题的性 ...

  5. 【BZOJ4999】This Problem Is Too Simple!(线段树)

    [BZOJ4999]This Problem Is Too Simple!(线段树) 题面 BZOJ 题解 对于每个值,维护一棵线段树就好啦 动态开点,否则空间开不下 剩下的就是很简单的问题啦 当然了 ...

  6. 【BZOJ2298】[HAOI2011]problem a DP

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

  7. 【BZOJ4999】This Problem Is Too Simple! 离线+树状数组+LCA

    [BZOJ4999]This Problem Is Too Simple! Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2 ...

  8. BZOJ3339&&3585 Rmq Problem&&mex

    BZOJ3339&&3585:Rmq Problem&&mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最 ...

  9. 【计算几何】FZU Problem 2270 Two Triangles

    http://acm.fzu.edu.cn/problem.php?pid=2270 [题意] 给定6到10个点,从中选出6个不同的点组成两个三角形,使其中一个三角形可以通过另一个三角形平移和旋转得到 ...

随机推荐

  1. httpclient通过post提交到webapi

    var client = new HttpClient(); var url = BASConfig.Instance.SiteSettingsModule.SyncWorkLogAppUrl; va ...

  2. 在JavaScript中同步与异步

    在JavaScript中,一个线程执行的时候不依靠其他线程处理完毕我们称为异步,相反一个线程必须等待直到另一个线程处理完毕我们则称为同步.打个比方: (1)同步就是你在煮方便面的时候必须等水开了,你才 ...

  3. Flask之目录结构

    学习Flask,整合其目录结构也是比较重要的.一个最基础的Flask目录如下所示: 一.SQLAlchemy-utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchem ...

  4. 面向对象之套接字(socket)和黏包

    一丶套接字(socket) tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 基于UDP协议的socket server端: import socket udp_sk = socke ...

  5. es6-Iterator与for...of

    Iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set.这样就有了四种数据集合,用户还可以组合 ...

  6. 关于web开发中订单自动超时和自动收货的简单方法(window server)

    最近做一个订单自动超时和自动收货的功能,因为以前是用的mysql 存储过程和定时器来完成,这次的业务逻辑相对复杂用以前的方式就不太合适,本来是准备使用定时执行php脚本来实现的,后来发现业务逻辑中使用 ...

  7. int _tmain(int argc, _TCHAR* argv[])

    int _tmain(int argc, _TCHAR* argv[]){ int i; for (i = 0; i<argc; i++) cout<<argv[i]<< ...

  8. kernel

    http://sebastianraschka.com/Articles/2014_kernel_pca.html

  9. C#创建和使用ActiveX组件

    开发基于.Net平台上的程序员是很难从本质上把Visual C#和ActiveX组件联起来,虽然在使用Visual C#开发应用程序时,有时为了快速开发或者由于.Net FrameWork SDK的不 ...

  10. 解决使用Application Loader上传ipa提示“上传appstore失败”

    试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...