zoukankan      html  css  js  c++  java
  • poj2452(RMQ+二分)

    题目链接:POJ - 2452

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn=50010;
     7 
     8 int qmax[maxn][30],qmin[maxn][30];
     9 int a[maxn];
    10 int MIN(int x,int y) //返回下标
    11 {
    12     if(a[x]<a[y]) return x;
    13     else return y;
    14 }
    15 int MAX(int x,int y)//返回下标
    16 {
    17     if(a[x]>a[y]) return x;
    18     else return y;
    19 }
    20 void INIT_RMQ(int n)
    21 {
    22     int k=log2(n);
    23     for(int i=0;i<=n;i++)
    24         qmax[i][0]=qmin[i][0]=i;
    25     for(int j=1;j<=k;j++)
    26         for(int i=1;i+(1<<j)-1<=n;i++)
    27     {
    28         qmax[i][j]=MAX(qmax[i][j-1],qmax[i+(1<<j-1)][j-1]);
    29         qmin[i][j]=MIN(qmin[i][j-1],qmin[i+(1<<j-1)][j-1]);
    30     }
    31     return;
    32 }
    33 
    34 int rmqmax(int x,int y)
    35 {
    36     int k=log2(y-x+1);
    37     return MAX(qmax[x][k],qmax[y-(1<<k)+1][k]);
    38 }
    39 int rmqmin(int x,int y)
    40 {
    41     int k=log2(y-x+1);
    42     return MIN(qmin[x][k],qmin[y-(1<<k)+1][k]);
    43 }
    44 int BIN(int id,int l,int r)
    45 {
    46     while(l<=r)
    47     {
    48         if(l==r) return l;
    49         int m=(l+r)>>1;
    50         if(a[rmqmin(l,m)]>a[id]) l=m+1; 
    51         else r=m;
    52     }
    53 }
    54 int main()
    55 {
    56         int n;
    57         while(scanf("%d",&n)!=EOF)
    58         {
    59             for(int i=1;i<=n;i++)
    60                 scanf("%d",&a[i]);
    61             INIT_RMQ(n);
    62             int ans=0;//二分
    63             for(int i=1;i+ans<n;i++)
    64             {
    65                 int r=BIN(i,i+1,n);
    66                 int k=rmqmax(i,r);
    67                 if(a[k]>a[i]) ans=max(ans,k-i);
    68             }
    69             if(ans==0) puts("-1");
    70             else printf("%d
    ",ans);
    71         }
    72 }
  • 相关阅读:
    2.22
    LG P7077 函数调用
    2020/10/30 模拟赛 序列
    2020/10/27 模拟赛 数列
    2020/10/23 模拟赛 chip
    2020/10/23 模拟赛 escape
    2020/10/23 模拟赛 center
    LOJ#6581. 「ICPC World Finals 2019」断头路探测者
    LG P1587 [NOI2016]循环之美
    LG P4156 [WC2016]论战捆竹竿
  • 原文地址:https://www.cnblogs.com/yijiull/p/6789417.html
Copyright © 2011-2022 走看看