题目:

给出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也写出来了,还需要在研究一下。

代码:

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define MAX 1e3
  4. #define FRE() freopen("in.txt","r",stdin)
  5. #define FRO() freopen("out.txt","w",stdout)
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<int, int> P;
  9. const int maxn = ;
  10. int pos[maxn],a[maxn];
  11. int dmin[maxn][],dmax[maxn][];
  12. int mi[maxn],mx[maxn];
  13. int n;
  14.  
  15. void InitMinRMQ(){
  16. mi[] = -;
  17. for(int i=; i<=n; i++){
  18. mi[i] = ((i&(i-))==) ? mi[i-]+:mi[i-];
  19. dmin[i][] = a[i];
  20. }
  21. for(int j=; j<=mi[n]; j++){
  22. for(int i=; i+(<<j)-<=n; i++){
  23. dmin[i][j]=min(dmin[i][j-], dmin[i+(<<(j-))][j-]);
  24. }
  25. }
  26. }
  27.  
  28. int MinRMQ(int x,int y){
  29. int k = mi[y-x+];
  30. return min(dmin[x][k],dmin[y-(<<k)+][k]);
  31. }
  32.  
  33. void InitMaxRMQ(){
  34. mx[] = -;
  35. for(int i=; i<=n; i++){
  36. mx[i] = ((i&(i-))==) ? mx[i-]+:mx[i-];
  37. dmax[i][] = a[i];
  38. }
  39. for(int j=; j<=mx[n]; j++){
  40. for(int i=; i+(<<j)-<=n; i++){
  41. dmax[i][j] = max(dmax[i][j-],dmax[i+(<<(j-))][j-]);
  42. }
  43. }
  44. }
  45.  
  46. int MaxRMQ(int x,int y){
  47. int k = mx[y-x+];
  48. return max(dmax[x][k], dmax[y-(<<k)+][k]);
  49. }
  50.  
  51. int main(){
  52. //FRE();
  53. int kase;
  54. scanf("%d",&kase);
  55. while(kase--){
  56. scanf("%d",&n);
  57. for(int i=; i<=n; i++){
  58. scanf("%d",&a[i]);
  59. pos[a[i]] = i;
  60. }
  61. InitMaxRMQ();
  62. InitMinRMQ();
  63. //cout<<MinRMQ(1,n)<<" "<<MaxRMQ(1,n)<<endl;
  64. bool ok = false;
  65. for(int i=; i<n; i++){
  66. for(int j=i+; j<=n; j++){
  67. int tmin = MinRMQ(i, j);
  68. int tmax = MaxRMQ(i, j);
  69. if(a[i]<a[j] && pos[tmax]<pos[tmin]){
  70. ok = true;
  71. }
  72. if(a[i]>a[j] && pos[tmax]>pos[tmin]){
  73. ok = true;
  74. }
  75. }
  76. if(ok)
  77. break;
  78. }
  79. if(ok)
  80. printf("YES\n");
  81. else
  82. printf("NO\n");
  83. }
  84. return ;
  85. }

UVA - 1618 Weak Key(RMQ算法)的更多相关文章

  1. UVa - 1618 - Weak Key

    Cheolsoo is a cryptographer in ICPC(International Cryptographic Program Company). Recently, Cheolsoo ...

  2. RMQ算法 以及UVA 11235 Frequent Values(RMQ)

    RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8)  内的最大值.数据量小 ...

  3. RMQ算法讲解

    RMQ算法 引入: 例1.题目描述 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值.   第一种方法:大暴力之术. 但是……时间复杂度最坏会达到 $O(NM)$,一半 ...

  4. RMQ算法

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  5. RMQ算法 (ST算法)

     概述: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中 ...

  6. RMQ算法详解

    RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法. 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) . ...

  7. nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)

    题目119 题目信息 执行结果 本题排行 讨论区 士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军统率着N个士兵,士兵分别编号为1~N,南将军常 ...

  8. RMQ 算法入门

    1. 概述 RMQ(Range Minimum/Maximum Query).即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  9. RMQ 算法 学习整理

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

随机推荐

  1. HDU 1394 线段树or 树状数组~

    Minimum Inversion Number Description The inversion number of a given number sequence a1, a2, ..., an ...

  2. 【Poj 1330】Nearest Common Ancestors

    http://poj.org/problem?id=1330 题目意思就是T组树求两点LCA. 这个可以离线DFS(Tarjan)-----具体参考 O(Tn) 0ms 还有其他在线O(Tnlogn) ...

  3. 魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.

    魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.         医院(诊所)名称:CAPRI妇产科诊所 妇产科,华人医生,微创妇科手术专科医生,女医生,fountai ...

  4. Python: PS 图像特效 — 抽象画风

    今天介绍一种基于图像分割和color map 随机采样生成一种抽象画风的图像特效,简单来说,就是先生成一张 color map 图,颜色是渐变的,然后针对要处理的图像,进行分割,这里用的是 SLIC ...

  5. Java 泛型 一

    泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇将立足于代码介绍.总结了关于泛型的知识. 先看下面的代码: List list = new ArrayList(); list ...

  6. Python 私有化类的属性

    class MandgerSec: def __init__(self,name,gender,level): self.type=("fire",None) self.name= ...

  7. linux中touch命令参数修改文件的时间戳(转载)

    转自:http://os.51cto.com/art/200908/144237.htm linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存 ...

  8. 10.11NOIP模拟题(2)

    /* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...

  9. [Code+#1]大吉大利,晚上吃鸡!

    输入输出样例 输入样例#1: 7 7 1 7 1 2 2 2 4 2 4 6 2 6 7 2 1 3 2 3 5 4 5 7 2 输出样例#1: 6 输入样例#2: 5 5 1 4 1 2 1 1 3 ...

  10. linux C编程 Makefile的使用

    Makefile的作用就是"自动化编译" 一.Makefile基本规则 下面给出几个简单实例: 第一步:分别用vim创建prog.c code.c code.h三个文件 prog. ...