【bzoj3339】Rmq Problem
【bzoj3339】Rmq Problem
Description

Input

Output

Sample Input
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
Sample Output
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的更多相关文章
- 【Luogu4137】Rmq Problem/mex (莫队)
[Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...
- 【BZOJ】【3339】Rmq Problem
离线+线段树 Orz Hzwer,引用题解: 这一题在线似乎比较麻烦 至于离线.. 首先按照左端点将询问排序 然后一般可以这样考虑 首先如何得到1-i的sg值呢 这个可以一开始扫一遍完成 接着考虑l- ...
- 【luogu4137】 Rmq Problem / mex - 莫队
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 思路 莫队水过去了 233 #include <bits/stdc++.h> ...
- 【BZOJ2302】[HAOI2011]Problem C(动态规划)
[BZOJ2302][HAOI2011]Problem C(动态规划) 题面 BZOJ 洛谷 题解 首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的. 然而这题也有属于这题的性 ...
- 【BZOJ4999】This Problem Is Too Simple!(线段树)
[BZOJ4999]This Problem Is Too Simple!(线段树) 题面 BZOJ 题解 对于每个值,维护一棵线段树就好啦 动态开点,否则空间开不下 剩下的就是很简单的问题啦 当然了 ...
- 【BZOJ2298】[HAOI2011]problem a DP
[BZOJ2298][HAOI2011]problem a Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相 ...
- 【BZOJ4999】This Problem Is Too Simple! 离线+树状数组+LCA
[BZOJ4999]This Problem Is Too Simple! Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2 ...
- BZOJ3339&&3585 Rmq Problem&&mex
BZOJ3339&&3585:Rmq Problem&&mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最 ...
- 【计算几何】FZU Problem 2270 Two Triangles
http://acm.fzu.edu.cn/problem.php?pid=2270 [题意] 给定6到10个点,从中选出6个不同的点组成两个三角形,使其中一个三角形可以通过另一个三角形平移和旋转得到 ...
随机推荐
- httpclient通过post提交到webapi
var client = new HttpClient(); var url = BASConfig.Instance.SiteSettingsModule.SyncWorkLogAppUrl; va ...
- 在JavaScript中同步与异步
在JavaScript中,一个线程执行的时候不依靠其他线程处理完毕我们称为异步,相反一个线程必须等待直到另一个线程处理完毕我们则称为同步.打个比方: (1)同步就是你在煮方便面的时候必须等水开了,你才 ...
- Flask之目录结构
学习Flask,整合其目录结构也是比较重要的.一个最基础的Flask目录如下所示: 一.SQLAlchemy-utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchem ...
- 面向对象之套接字(socket)和黏包
一丶套接字(socket) tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 基于UDP协议的socket server端: import socket udp_sk = socke ...
- es6-Iterator与for...of
Iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set.这样就有了四种数据集合,用户还可以组合 ...
- 关于web开发中订单自动超时和自动收货的简单方法(window server)
最近做一个订单自动超时和自动收货的功能,因为以前是用的mysql 存储过程和定时器来完成,这次的业务逻辑相对复杂用以前的方式就不太合适,本来是准备使用定时执行php脚本来实现的,后来发现业务逻辑中使用 ...
- int _tmain(int argc, _TCHAR* argv[])
int _tmain(int argc, _TCHAR* argv[]){ int i; for (i = 0; i<argc; i++) cout<<argv[i]<< ...
- kernel
http://sebastianraschka.com/Articles/2014_kernel_pca.html
- C#创建和使用ActiveX组件
开发基于.Net平台上的程序员是很难从本质上把Visual C#和ActiveX组件联起来,虽然在使用Visual C#开发应用程序时,有时为了快速开发或者由于.Net FrameWork SDK的不 ...
- 解决使用Application Loader上传ipa提示“上传appstore失败”
试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...