zoukankan      html  css  js  c++  java
  • poj 3368 Frequent values

    第一道RMQ就因为vector没有清空而WA了。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 using namespace std;
     5 const int maxn=100000+5;
     6 vector<int> interval[maxn];
     7 int s[maxn];
     8 int value[maxn];
     9 int count[maxn];
    10 int num[maxn];
    11 int left[maxn];
    12 int right[maxn];
    13 int n,m;
    14 int d[maxn][100];
    15 int RMQ(int L,int R)
    16 {
    17     int k=0;
    18     while((1<<(k+1))<=R-L+1) k++;
    19     return max(d[L][k],d[R-(1<<k)+1][k]);
    20 }
    21 int main()
    22 {
    23     while(scanf("%d",&n)!=EOF&&n)
    24     {
    25          scanf("%d",&m);
    26         memset(count,0,sizeof(count));
    27         for(int i=0;i<n;i++)
    28             interval[i].clear();
    29         for(int i=0;i<n;i++)
    30             scanf("%d",&s[i]);
    31             int k=0;
    32             value[0]=s[0];
    33             count[0]++;
    34             interval[0].push_back(0);
    35         for(int i=1;i<n;i++)
    36         {
    37             if(s[i]==value[k])
    38             {
    39                 num[i]=k;
    40                 count[k]++;
    41                 interval[k].push_back(i);
    42             }
    43             else
    44             {
    45                 value[++k]=s[i];
    46                 num[i]=k;
    47                 count[k]++;
    48                 interval[k].push_back(i);
    49             }
    50         }
    51         int len=k+1;
    52         for(int i=0;i<n;i++)
    53         {
    54             left[i]=interval[num[i]][0];
    55             if(interval[num[i]].size()>1)
    56                 right[i]=interval[num[i]][(int)interval[num[i]].size()-1];
    57             else
    58                 right[i]=left[i];
    59         }
    60         memset(d,0,sizeof(d));
    61         for(int i=0;i<len;i++) d[i][0]=count[i];
    62         for(int j=1;(1<<j)<=len;j++)
    63             for(int i=0;i+(1<<j)-1<len;i++)
    64              d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
    65         for(int i=0;i<m;i++)
    66         {
    67             int L,R;
    68             scanf("%d%d",&L,&R);
    69             L--;R--;
    70             if(num[L]==num[R])
    71             {printf("%d
    ",R-L+1);continue;}
    72             int c=0;
    73             int a=right[L]-L+1;
    74             int b=R-left[R]+1;
    75             if(left[R]-right[L]>1)
    76             c=RMQ(num[L]+1,num[R]-1);
    77             printf("%d
    ",max(a,max(b,c)));
    78         }
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    package.json文件
    Node.js中模块加载机制
    第三方模块
    系统模块
    Node.js快速入门及模块化开发
    String 的扩展方法
    ES6 的内置对象扩展
    箭头函数
    解构赋值
    let、const、var 的区别
  • 原文地址:https://www.cnblogs.com/sooflow/p/3264945.html
Copyright © 2011-2022 走看看