UVa 11235

来源:互联网 发布:淘宝鼠标滑动效果代码 编辑:程序博客网 时间:2024/04/27 17:36
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=1000010;int n,q,a[maxn],x,y,d[maxn][20],values[maxn],counts[maxn],num[maxn],le[maxn],ri[maxn];vector<int> v;void RMQ_init(const vector<int>& v){    int n=v.size();    for(int i=0;i<n;i++) d[i][0]=v[i];    for(int j=1;(1<<j)<=n;j++)        for(int i=0;i+(1<<j)-1<n;i++)        d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);}int RMQ(int L,int R){    int k=0;    while((1<<(1+k))<=R-L+1) k++;    return max(d[L][k],d[R-(1<<k)+1][k]);}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==0)            break;        scanf("%d",&q);        v.clear();        int kase=0;        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        a[n]=a[n-1]+1;        for(int i=1;i<=n;i++)        {            if(a[i]!=a[i-1])            {                v.push_back(i-kase);                for(int j=kase;j<i;j++)                {                    num[j]=v.size()-1;                    le[j]=kase;                    ri[j]=i-1;                }                kase=i;            }        }        RMQ_init(v);        for(int i=1;i<=q;i++)        {            int maxs=-100;            scanf("%d%d",&x,&y);            x--;y--;            if(num[x]==num[y]) maxs=y-x+1;            else            {                maxs=max(y-le[y]+1,maxs);                maxs=max(ri[x]-x+1,maxs);                if(num[x]+1<num[y])                {                    maxs=max(maxs,RMQ(num[x]+1,num[y]-1));                }            }            printf("%d\n",maxs);        }    }    return 0;}

第一次学习到了关于RMQ的知识点,知识点还是很好理解的,但是这个题还是比较恶心的啊。不是很好写,一开始的num、left、right函数就不太好写,这里直接把重复的次数当作了vector里的元素压进去了,用的真的是十分的巧妙的,然后就是这个在写这里的代码的时候有一个问题就是关于下标是1开始0开始的问题,这个地方需要注意书上的模版里的是从0开始的。如果在自己的main函数里的设置最好是设置成0开始,特别是这个num也要从0开始标记。即不能是num[j]=v.size();而应该是num[j]=v.size()-1;才是正确的。然后下面的程序都是按照书上的的思路来。不过需要把模版里的min改成max即可,因为d数组里的值此时是从i开始长度为2<<j的一段元素里的最大重复次数。然后main里求maxs的就需要从LR同一段、LR分成连接的两段、以及LR分成分开的两段(L、R之间还有某些段)这三类进行分析即可。  

看来RMQ的知识点也就是模版还是很好理解的。但是实际的题目的应用上还是有点难的。

0 0
原创粉丝点击