UVA - 1618 Weak Key(RMQ算法)
题目:
给出k个互不相同的证书组成的序列Ni,判断是否存在4个证书Np、Nq、Nr、Ns(1≤p<q<r<s≤k)使得Nq>Ns>Np>Nr或者Nq<Ns<Np<Nr。
思路:
有两种情况<小、最大、最小、大>、<大、最小、最大、小>,枚举第1个和第4个数,用RMQ查询这两个数之间的最大值和最小值,然后根据给出的条件判断一下就可以了。
看到好多大佬不用RMQ也写出来了,还需要在研究一下。
代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = ;
int pos[maxn],a[maxn];
int dmin[maxn][],dmax[maxn][];
int mi[maxn],mx[maxn];
int n; void InitMinRMQ(){
mi[] = -;
for(int i=; i<=n; i++){
mi[i] = ((i&(i-))==) ? mi[i-]+:mi[i-];
dmin[i][] = a[i];
}
for(int j=; j<=mi[n]; j++){
for(int i=; i+(<<j)-<=n; i++){
dmin[i][j]=min(dmin[i][j-], dmin[i+(<<(j-))][j-]);
}
}
} int MinRMQ(int x,int y){
int k = mi[y-x+];
return min(dmin[x][k],dmin[y-(<<k)+][k]);
} void InitMaxRMQ(){
mx[] = -;
for(int i=; i<=n; i++){
mx[i] = ((i&(i-))==) ? mx[i-]+:mx[i-];
dmax[i][] = a[i];
}
for(int j=; j<=mx[n]; j++){
for(int i=; i+(<<j)-<=n; i++){
dmax[i][j] = max(dmax[i][j-],dmax[i+(<<(j-))][j-]);
}
}
} int MaxRMQ(int x,int y){
int k = mx[y-x+];
return max(dmax[x][k], dmax[y-(<<k)+][k]);
} int main(){
//FRE();
int kase;
scanf("%d",&kase);
while(kase--){
scanf("%d",&n);
for(int i=; i<=n; i++){
scanf("%d",&a[i]);
pos[a[i]] = i;
}
InitMaxRMQ();
InitMinRMQ();
//cout<<MinRMQ(1,n)<<" "<<MaxRMQ(1,n)<<endl;
bool ok = false;
for(int i=; i<n; i++){
for(int j=i+; j<=n; j++){
int tmin = MinRMQ(i, j);
int tmax = MaxRMQ(i, j);
if(a[i]<a[j] && pos[tmax]<pos[tmin]){
ok = true;
}
if(a[i]>a[j] && pos[tmax]>pos[tmin]){
ok = true;
}
}
if(ok)
break;
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return ;
}
UVA - 1618 Weak Key(RMQ算法)的更多相关文章
- UVa - 1618 - Weak Key
Cheolsoo is a cryptographer in ICPC(International Cryptographic Program Company). Recently, Cheolsoo ...
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- RMQ算法讲解
RMQ算法 引入: 例1.题目描述 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值. 第一种方法:大暴力之术. 但是……时间复杂度最坏会达到 $O(NM)$,一半 ...
- RMQ算法
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
- RMQ算法 (ST算法)
概述: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中 ...
- RMQ算法详解
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法. 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) . ...
- nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)
题目119 题目信息 执行结果 本题排行 讨论区 士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描写叙述 南将军统率着N个士兵,士兵分别编号为1~N,南将军常 ...
- RMQ 算法入门
1. 概述 RMQ(Range Minimum/Maximum Query).即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
- RMQ 算法 学习整理
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
随机推荐
- YTU 2530: 小勇玩lol
2530: 小勇玩lol 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 77 题目描述 小勇是一个忠实的lol玩家,他有自己的战斗力计算方法,每个星期他都会算一下自己的 ...
- Chapter 4 Syntax Analysis
Chapter 4 Syntax Analysis This chapter is devoted to parsing methods that are typically used in comp ...
- Python实现用户交互,显示省市县三级联动的选择
题目:Python实现用户交互,显示省市县三级联动的选择 定义的字典为: dic = { "江西": { "萍乡": ["安源", &quo ...
- FastDFS的介绍
FastDFS的介绍 FastDFS FastDFS是由国人余庆所开发,其项目地址: https://github.com/happyfish100 FastDFS是一个轻量级的开源分布式文件系统,主 ...
- 17年day5
/* 嗯,一切都快要结束了. 觉得不必要写太多,从day5开始就挺好吧. 记得去年这时候看到峰峰博客里的倒计时,心里还毫无波动,只是走的时候挺伤心. 现在轮到了我们. 峰峰我想你. 衷心祝zjk和my ...
- 基于Numpy的神经网络+手写数字识别
基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class ...
- Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)
题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比 ...
- [转]ASP.NET MVC Domain Routing
本文转自:http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx ASP.NET MVC Domai ...
- java简单打印金字塔(案例)
学习编程语言,打印简单的金字塔是基础的案例,在这里就简单的写了个案例,希望能帮助到各位 代码 效果 class kinTa{ public static void main(String[] ...
- C#,VB.NET将PPT文档转换为HTML
PPT文档主要用于展示,有时候我们需要将PPT文档转换为HTML格式方便查看.本文将介绍如何使用C#和VB.NET将PPT文档转换为HTML格式.该方案使用了.NET PowerPoint 组件Spi ...