zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    小数据池,深浅拷贝以及集合
    字典
    列表,元组以及range
    整型,布尔值以及字符串详解
    while循环,格式化输出,运算符及编码初识
    Python简介以及入门
    码云以及Git的使用
    JaveScript——简介、语法
    网页练习
    HTML_css样式表 样式属性 格式布局
  • 原文地址:https://www.cnblogs.com/yijiull/p/7262691.html
Copyright © 2011-2022 走看看