zoukankan      html  css  js  c++  java
  • 【poj3368】Frequent values

    没学ST之前肯定是用线段树什么的写,不过如果把它看作一个RMQ问题代码量突然就降了下来。

    ST算法可以实现O(NlogN)预处理,O(1)时间查询。

    蓝书上说的是开三个num,left和right数组存该位置所在段的编号和左右端点位置,其实没有必要,只要从l向右走到第一次出现的数字(即第t位)那里(比如-1,-1,-1,1,2中查询第2-第5,则l要走到a[4]==1处,此时t=4),然后跑一遍ST,最后取RMQ所求的最大值和t-l的较大值即可。

    具体实现细节看代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1000005],f[1000005][20],d[1000005];
    int rmq(int l,int r)
    {
        if(l>r)return 0;
        int k=0;
        while((1<<(k+1))<=r-l+1)k++;
        return max(f[l][k],f[r-(1<<k)+1][k]);
    }
    int main()
    {
        int n,q,l,r,t;
        while(scanf("%d",&n)&&n)
        {
            scanf("%d",&q);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                if(i>=2&&a[i]==a[i-1])d[i]=d[i-1]+1;
                else d[i]=1;
                f[i][0]=d[i];
            }
            for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
            for(int i=1;i<=q;i++)
            {
                scanf("%d %d",&l,&r);
                t=l;
                while(t<=r&&a[t]==a[t-1])t++;
                printf("%d
    ",max(rmq(t,r),t-l));
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    WSGI原理
    主从数据库
    mysql高级
    记录
    获取当前时间
    sql注入和防sql注入
    python操作MySQL
    修改Windows10 命令终端cmd的编码为UTF-8
    MySQL查询
    MySQL数据库操作
  • 原文地址:https://www.cnblogs.com/JKAI/p/7003417.html
Copyright © 2011-2022 走看看