Frequent values UVA - 11235 (RMQ)

题意:询问对于一段数据中L到R中哪个数据出现的次数最多,输出次数,同时,该数据段为非降序序列。

思路:对于该题已经给出了该数据为非降序序列,那我们可以直接统计出对于某一个数字该数字出现的次数同时使用count存入,同时对于题目给出的R与L,我们需要计算中间部分,因此需要才输入时对数据预处理存储数组RL代表该数字在第一次出现和最后一次出现的坐标。同时特判当R与L位置两值相同情况,因此可求出类RMQ的结构。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int num=1,num1=1;
const int N=100005;
int d[N][50],a[N],count1[N],s[N],L[N],R[N];
int n,q,len;
void RMQ_init()
{
    rep(i,1,len+1)
    {
        d[i][0]=count1[i];
    }
    for(int j=1;(1<<j)<=len+1;j++)
        for(int i=1;i+(1<<j)-1<=len;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<<(k+1))<=R-L+1) k++;
    return max(d[L][k],d[R-(1<<k)+1][k]);
}


// head
 int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    while(cin>>n&&n!=0)
    {
        cin>>q;
         len=1;
        memset(count1,0,sizeof(count1));
        rep(i,1,n+1)
        {
            int t;
            cin>>t;
            a[i]=t;
            if(i==1)
            {
                s[i]=len;
                L[len]=i;
            }
            else if(a[i]==a[i-1])
            {
                count1[len]++;
                s[i]=len;
            }
            else
            {
                R[len]=i-1;
                len++;
                L[len]=i;
                count1[len]=1;
                s[i]=len;
            }
        }
        RMQ_init();
        rep(i,0,q)
        {
            int r,l;
            cin>>l>>r;
            int x=s[r],y=s[l];
            if(a[l]==a[r])
            {
                cout<<r-l+1<<endl;
                continue;
            }
            int ans=0;
            if(y+1<=x-1)
                ans=RMQ(y+1,x-1);
            ans=max(ans,max(R[y]-l+1,r-L[x]+1));
            cout<<ans<<endl;
        }
    }

}

 

posted @ 2021-03-05 18:15  大抵一个菜鸡而已  阅读(40)  评论(0编辑  收藏  举报