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; } } }