• RMQ


    Frequent values

     UVA - 11235 

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define CLR(m,a) memset(m,a,sizeof(m))
     5 
     6 const int maxn=100010;
     7 int val[maxn],cnt[maxn];
     8 int num[maxn],Left[maxn],Right[maxn];
     9 int n,m;
    10 int sz;
    11 int d[maxn][25];
    12 
    13 void RMQ_init(int n){
    14     for(int i=0;i<n;i++) d[i][0]=cnt[i];
    15     for(int j=1;(1<<j)<=n;j++)
    16     for(int i=0;i+(1<<j)-1<n;i++){
    17         d[i][j]=max(d[i][j-1],d[i+(1<<j-1)][j-1]);
    18     }
    19 }
    20 int RMQ(int L,int R){
    21     int k=0;
    22     while(1<<(k+1)<=R-L+1) k++;
    23     return max(d[L][k],d[R-(1<<k)+1][k]);
    24 }
    25 int main()
    26 {
    27     while(scanf("%d",&n)==1&&n){
    28         scanf("%d",&m);
    29         sz=0;
    30         int s,e;
    31         CLR(cnt,0);
    32         scanf("%d",&s);
    33         Left[0]=0;
    34         num[0]=0;
    35         val[0]=s;
    36         cnt[0]=1;
    37         int f=0;
    38         for(int i=1;i<n;i++){
    39             scanf("%d",&e);
    40             if(e==s){
    41                 num[i]=sz;
    42                 cnt[sz]++;
    43                 Left[i]=f;
    44             }else{
    45                 for(int j=f;j<i;j++) Right[j]=i-1;
    46                 sz++;
    47                 val[sz]=e;
    48                 cnt[sz]=1;
    49                 num[i]=sz;
    50                 Left[i]=i;
    51                 Right[i]=i;
    52                 f=i;   //记录最左的位置
    53                 s=e;
    54             }
    55         }
    56         RMQ_init(sz+1);
    57         while(m--){
    58             int a,b;
    59             scanf("%d%d",&a,&b);
    60             a--;b--;
    61             int ans=0;
    62             if(num[a]!=num[b]){
    63                 ans=max(Right[a]-a+1,b-Left[b]+1);
    64                 a=num[a]+1;
    65                 b=num[b]-1;
    66                 if(a<=b) ans=max(ans,RMQ(a,b));
    67             }else 
    68                 ans=b-a+1;
    69             printf("%d
    ",ans);
    70         }
    71     }
    72     return 0;
    73 }
    View Code
  • 相关阅读:
    第四十七课、父子间的冲突
    第四十六课、继承中的构造与析构
    第四十五课、不同的继承方式
    第四十四课、继承中的访问级别
    第四十三课、继承的概念和意义
    第四十二课、类型转换函数(下)
    第四十一课、类型转化构造函数(上)
    暴力大法好
    HideProcess
    Hduacm—5497
  • 原文地址:https://www.cnblogs.com/yijiull/p/7262691.html
Copyright © 2020-2023  润新知