传送:http://acm.hdu.edu.cn/showproblem.php?pid=6483

题意:有长度为$n$的数组,对于一个子区间$[l,r]$内,存在最大值$mx$与最小值$mi$,有$q$的询问,每个询问要求判断在某个子区间$[l,r]$内$[mi,mx]$的值是否连续存在,即$mi,mi+1,....,mx$每个数都出现过至少一次。$T=5,1<=n<=10000,1<=a_i<=10^9,1<=m<=100000$

分析:

多个区间查询问题,考虑莫队算法。

对于每一个询问,需要判断$mi$到$mx$内的数是否全部存在,且需要知道$mi$与$mx$。考虑先预处理出每个子区间的最值,离线查询。

$a_i<=10^9$,数组$num[]$没办法开下,需要离散化处理。

先ST预处理最值,然后离散化,莫队求区间内值种类的个数。

代码:

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
struct node{
int l,r,id,block,mx,mi;
}q[maxn];
int a[maxn],b[maxn],maxPoint[maxn][],minPoint[maxn][],num[maxn];
bool ans[maxn];
int cnt=,n,m,block,ll,rr;
bool cmp(node p,node q){
return p.block<q.block || p.block==q.block && p.r<q.r;
}
void add(int x){
int tmp=a[x];
if (num[tmp]==) cnt++;
num[tmp]++;
}
void del(int x){
int tmp=a[x];
if (num[tmp]==) cnt--;
num[tmp]--;
}
void init(){
for (int i = ; i <= n; i++){
minPoint[i][] = maxPoint[i][] = a[i];
}
for (int j = ; ( << j) <= n; j++){
for (int i = ; i + ( << j) - <= n; i++){
int p = ( << (j - ));
minPoint[i][j] = min(minPoint[i][j - ], minPoint[i + p][j - ]);
maxPoint[i][j] = max(maxPoint[i][j - ], maxPoint[i + p][j - ]);
}
}
}
int queryMin(int l, int r){
int k = log2((double)(r - l + ));
return min(minPoint[l][k], minPoint[r - ( << k) + ][k]);
} int queryMax(int l, int r){
int k = log2((double)(r - l + ));
return max(maxPoint[l][k], maxPoint[r - ( << k) + ][k]);
}
bool calc(node tmp){
if (tmp.mx-tmp.mi+==cnt) return true;
return false;
}
void init2(){
sort(b+,b++n);
int tmp=unique(b+,b++n)-(b+);
for (int i=;i<=n;i++){
a[i]=lower_bound(b+,b++tmp,a[i])-b;
num[i]=;
}
}
int main(){
int t; scanf("%d",&t);
while (t--){
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
init();
//离散化
block=sqrt(n);
for (int i=;i<m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i; q[i].block=q[i].l/block;
q[i].mx=queryMax(q[i].l,q[i].r);
q[i].mi=queryMin(q[i].l,q[i].r);
}
init2();
sort(q,q+m,cmp);
ll=,rr=; cnt=;
for (int i=;i<m;i++){
while (ll<q[i].l) del(ll++);
while (ll>q[i].l) add(--ll);
while (rr<q[i].r) add(++rr);
while (rr>q[i].r) del(rr--);
ans[q[i].id]=calc(q[i]);
}
for (int i=;i<m;i++)
if (ans[i]) printf("YES\n");
else printf("NO\n");
}
return ;
}

hdoj6483

hdoj6483 A Sequence Game(ST预处理RMQ+莫队)的更多相关文章

  1. BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]

    4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...

  2. [hdoj6483][莫队+线段树/ST]

    A Sequence Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*

    BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...

  4. BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)

    BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...

  5. [bzoj4540][Hnoi2016][序列] (莫队算法+单调栈+st表)

    Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...

  6. hdu 5381 The sum of gcd 莫队+预处理

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) P ...

  7. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1567  Solved: 718[Submit][Status] ...

  8. 『序列 莫队 dp预处理』

    序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n]. 类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar-1,ar.若1≤l≤s≤t≤r≤n ...

  9. ST(RMQ)算法(在线)求LCA

    在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...

随机推荐

  1. nexus的安装和简介(3)

    从私服下载jar包  没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找jar,如果没有找到则连接私服从私服下载ja ...

  2. lastIndexOf() 找出指定元素出现的所有位置(返回的是下标数组)---lastIndexOf() 这个方法是倒叙查找,正序的是indexOf()

    var indices = []; var array = ['a', 'b', 'a', 'c', 'a', 'd']; var element = 'a'; var idx = array.las ...

  3. html 跳转页面传参、点击获取DOM参数

    虽然现在前端框架已经很多,尤其是几大流行框架,比如Vue,React,Angular 等,已经去DOM化,但是还是有很多公司仍在使用 HTML + CSS + JS . 这里记载一下用到的HTML传参 ...

  4. IDEA 工具从Json自动生成JavaBean

    1.先安装GsonFormat插件:File-->Setting-->Plugins-->GsonFormat-->OK 2.new 一个新的Class空文件,然后 Alt+I ...

  5. 如何使用Shiro

    一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使用.但是最常用的环境还是JavaEE.下面以 ...

  6. 关于.gitignore无法过滤某些文件

    .gitignore文件用于忽略那些无需添加到版本管理的文件.但最近发现有些文件即使被加入到了.gitignore文件中,push时仍会被上传. 原因:如果某些文件已经被纳入了版本管理中,就算是在.g ...

  7. ubuntu输入法

    一直都是使用搜狗的,但是感觉一直都不兼容.经常输入一串文字导致输入法崩溃 比如 ‘外显’waixian就崩了. 而且会出现fcitx 100%cpu占用的情况 pkill fcitx &&am ...

  8. AC自动机——1 Trie树(字典树)介绍

    AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...

  9. 代码之髓读后感——容器&并发

    容器 单个地址存放单个数据,但是如果有多个数据,而这些数据互相关联,则我们更希望的是将他们能够更好的在内存中组织在一起.于是便出现了容器的概念. 在不同的语言中,容器的名称不同,性质各异.比如,C 语 ...

  10. 一不注意,在Unity3D中DllImport 引起的Bug.

    单要说这个Bug是很简单,但是得从头说起. 一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情.所以就需要用到动态 ...