zoukankan      html  css  js  c++  java
  • poj 3368 rmq ***

    题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 using namespace std;
     9 #define MOD 1000000007
    10 const int INF=0x3f3f3f3f;
    11 const double eps=1e-5;
    12 typedef long long ll;
    13 #define cl(a) memset(a,0,sizeof(a))
    14 #define ts printf("*****
    ");
    15 int n,m,tt;
    16 const int MAXN = 100005;
    17 int dp[MAXN][20];
    18 int mm[MAXN];
    19 //初始化RMQ, b数组下标从1开始,从0开始简单修改
    20 void initRMQ(int n,int b[])
    21 {
    22 mm[0] = -1;
    23 for(int i = 1; i <= n;i++)
    24 {
    25 mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];
    26 dp[i][0] = b[i];
    27 }
    28 for(int j = 1; j <= mm[n];j++)
    29 for(int i = 1;i + (1<<j) -1 <= n;i++)
    30 dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    31 }
    32 //查询最大值
    33 int rmq(int x,int y)
    34 {
    35 int k = mm[y-x+1];
    36 return max(dp[x][k],dp[y-(1<<k)+1][k]);
    37 }
    38 int a[MAXN],f[MAXN];
    39 int main()
    40 {
    41     int i,j,k;
    42     #ifndef ONLINE_JUDGE
    43     freopen("1.in","r",stdin);
    44     #endif
    45     while(scanf("%d",&n)!=EOF)
    46     {
    47         if(n==0)  break;
    48         scanf("%d",&m);
    49         for(i=1;i<=n;i++)
    50         {
    51             scanf("%d",&a[i]);
    52             f[1]=1;
    53             if(i!=1)
    54             {
    55                 if(a[i]==a[i-1])
    56                 {
    57                     f[i]=f[i-1]+1;
    58                 }
    59                 else
    60                     f[i]=1;
    61             }
    62         }
    63         /*for(i=1;i<=n;i++)
    64         {
    65             printf("%d ",f[i]);
    66         }
    67         printf("
    ");*/
    68         initRMQ(n,f);
    69         while(m--)
    70         {
    71             int uu,v;
    72             scanf("%d%d",&uu,&v);
    73             int u=uu;
    74             while(u<=v&&a[u]==a[u-1])
    75             {
    76                 u++;
    77             }
    78             int ans=rmq(u,v);
    79             ans=max(u-uu,ans);
    80             printf("%d
    ",ans);
    81         }
    82     }
    83 }
  • 相关阅读:
    ArcEngine的符号库
    Web programming is functional programming (Web编程是函数式编程)
    arcengine中拓扑的使用(ZZ)
    Win32基于事件驱动的消息机制(ZZ)
    人生要小心处理的50件事
    谁想出来的?
    80后 最牛的辞职信
    能读懂这些话的,都是心里有故事的人
    Try to code some sql statement to catch the consume much CPU time sps.
    读书是为了生命的完整
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4620394.html
Copyright © 2011-2022 走看看