zoukankan      html  css  js  c++  java
  • POJ 3368 Frequent values RMQ 训练指南 好题

     1 #include<cstdio>
     2 #include<cstring>
     3 
     4 const int maxn=1e5+5;
     5 const int inf=0x3f3f3f3f;
     6 
     7 inline int max(int x,int y)
     8 {
     9     return x>y?x:y;
    10 }
    11 
    12 int a[maxn];
    13 int left[maxn];
    14 int right[maxn];
    15 int num[maxn];
    16 int dp[maxn][20];
    17 
    18 void init()
    19 {
    20     memset(a,0,sizeof a);
    21     memset(left,-1,sizeof left);
    22     memset(right,-1,sizeof right);
    23 }
    24 
    25 void init_rmq(int n)
    26 {
    27     for(int i=1;i<=n;i++)
    28         dp[i][0]=a[i];
    29     for(int j=1;(1<<j)<=n;j++)
    30     {
    31         for(int i=1;i+(1<<j)-1<=n;i++)
    32         {
    33             dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    34         }
    35     }
    36 }
    37 
    38 int query(int l,int r)
    39 {
    40     if(l>r)
    41         return 0;
    42     int k=0;
    43     while((1<<(k+1))<=r-l+1)
    44         k++;
    45     return max(dp[l][k],dp[r-(1<<k)+1][k]);
    46 }
    47 
    48 void solve(int n,int q)
    49 {
    50     init_rmq(n);
    51     for(int i=0;i<q;i++)
    52     {
    53         int L,R;
    54         scanf("%d%d",&L,&R);
    55         if(num[L]==num[R])
    56         {
    57             printf("%d
    ",R-L+1);
    58             continue;
    59         }
    60         int ans=max(right[num[L]]-L+1,R-left[num[R]]+1);
    61         ans=max(ans,query(num[L]+1,num[R]-1));
    62         printf("%d
    ",ans);
    63     }
    64     return ;
    65 }
    66 
    67 int main()
    68 {
    69     int cnt;
    70     while(scanf("%d",&cnt))
    71     {
    72         if(!cnt)
    73             break;
    74         int q;
    75         scanf("%d",&q);
    76         init();
    77         int pre=-inf;
    78         int n=0;
    79         for(int i=1;i<=cnt;i++)
    80         {
    81             int u;
    82             scanf("%d",&u);
    83             if(u!=pre)
    84             {
    85                 right[n]=i-1;
    86                 a[++n]=1;
    87                 left[n]=i;
    88             }
    89             else
    90                 a[n]++;
    91             num[i]=n;
    92             pre=u;
    93         }
    94         right[n]=cnt;
    95 
    96         solve(n,q);
    97     }
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    <context-param>与<init-param>的区别与作用(转自青春乐园)(
    使用Derby ij客户端工具
    转载 Ofbiz 入门教程
    数据库中插入和读取图片
    事务的使用
    存储过程
    触发器 的使用
    JS面试题及答案
    课程主页面三个接口开发
    增加media文件配置
  • 原文地址:https://www.cnblogs.com/-maybe/p/4703813.html
Copyright © 2011-2022 走看看