hdoj6483 A Sequence Game(ST预处理RMQ+莫队)
传送: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+莫队)的更多相关文章
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- [hdoj6483][莫队+线段树/ST]
A Sequence Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*
BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- [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 ...
- 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 ...
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1567 Solved: 718[Submit][Status] ...
- 『序列 莫队 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 ...
- ST(RMQ)算法(在线)求LCA
在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...
随机推荐
- Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入
Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...
- RTTI和反射小结
Java有两种方式让我们在运行时识别对象和类的信息:1.“传统的”RTTI,假定所有的类型编译时已知:2.“反射”机制,允许在运行时发现和使用类的信息. 一.RTTI RTTI(Run-Time Ty ...
- [PHP]误读支付宝接口可能引发的乌龙
------------------------------------------------------------------------------------ 之所以发现这个坑,源起项目中的 ...
- Hibernate 再接触 事务隔离机制
事务:要么都要完成,一个不完成就要回滚. ACID 原子性 一致性 独立性 持久性 第一类丢失更新 第一类丢失更新 脏读(读了另外一个事务没有提交的数据) 不可重复读(在同一个事务里,对数据库里的值前 ...
- JS 正则表达式基本语法(精粹)
1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束. 例子如下: "^The":表示所有以"The"开始的字符串( ...
- JDK中的注解简单了解
0.注解(注解是给编译器看的东东) 注解的定义方式是@Interface,注解属性定义是类似于普通类的方法定义的,注解属性赋值是使用default关键字完成的,如下图所示 注解在定义时可以给默认值,也 ...
- 云笔记项目-AOP知识简单学习
在云笔记项目的过程中,需要检查各个业务层的执行快慢,如登录.注册.展示笔记本列表,展示笔记列表等,如果在每个业务层方法里都写一段代码用来检查时间并打印,不仅仅显得代码重复,而且当项目很大的时候,将大大 ...
- 算法练习LeetCode初级算法之字符串
反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...
- AltiumDesigner PCB导入CAD
点击File菜单下的New的PCB,新建PCB文件. 在AD09中点击File菜单下的Import,导入CAD文件 选择要导入的CAD文件,点击打开. 选择单位mm,这里的单位选择要与CAD单位一致, ...
- mysql 数据库设计
数据库设计 需求分析 *1.用户模块 用于记录记录注册用户信息 包括属性:用户名,密码,电话,邮箱,身份证号,地址,姓名,昵称... 可选唯一标志属性:用户名,电话,身份证号 存储特点:随系统上线时间 ...