UVA11235 Frequent values(RMQ)

题目大意:给出一个升序的序列,对于一系列的询问(i,j),回答i到j中出现次数最多的数字。

白书上的例题QAQ,游程编码建立对应的序号与段与最远到达的区间的序号,用RMQ查询一下即可。

#include 
#include 
#include 
#include 
using namespace std;
const int N=100005;
int val[N];//第i段的值
int data[N];
int countt[N],num[N],left[N],right[N];//第i段的次数 位置p所在的段数 位置p所在段的左右端点
int rmq[N][50];

void makermq(int n)
{
    for(int i=1;i<=n;i++)
        rmq[i][0]=countt[i];

    for(int j=1;(1<=1;i--)
        {
            if(data[i]!=data[i+1])
                right[i]=i;
            else
                right[i]=right[i+1];
        }
/*
        for(int i=1;i<=n;i++)
            printf("%d %d\n",left[i],right[i]);
*/
        makermq(tot);
        while(q--)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            if(val[num[l]]==val[num[r]])
            {
                printf("%d\n",r-l+1);
            }
            else if(num[l]+1==num[r])
            {
                int ans1=right[l]-l+1;
                int ans2=r-left[r]+1;
                printf("%d\n",max(ans1,ans2));
            }
            else
            {
                int ans1=right[l]-l+1;
                int ans2=r-left[r]+1;
                int ans3=query(num[l]+1,num[r]-1);
                //printf("%d %d\n",num[l]+1,num[r]-1);
                //printf("%d %d %d\n",ans1,ans2,ans3);
                printf("%d\n",max(max(ans1,ans2),ans3));
            }
        }
    }
}


你可能感兴趣的:(RMQ)