ST表

//ST表
#include<bits/stdc++.h> #define IO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0) //#define int long long using namespace std; const int maxn=100000+5; int d[maxn][32]; void RMQ_init(int *A,int n) { for(int i=0;i<n;i++) d[i][0]=A[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)<=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<<(k+1))<=R-L+1) k++; return max(d[L][k],d[R-(1<<k)+1][k]); } int a[maxn],val[maxn],cnt[maxn],num[maxn],l[maxn],r[maxn]; int32_t main() { IO; int n,q,k; while(cin>>n&&n){ cin>>q; k=0; memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++){ cin>>a[i]; if(!i) { cnt[k]=1; num[i]=k; l[i]=k; r[i]=i; } else { if(a[i]==a[i-1]){ cnt[k]++; num[i]=k; l[i]=l[i-1]; } else { for(int j=l[i-1];j<i;j++) r[j]=i-1; k++; cnt[k]=1; num[i]=k; l[i]=i; r[i]=i; } } if(i==n-1){ if(a[i]==a[i-1]){ for(int j=l[i];j<n;j++) r[j]=i-1; } } } k++; RMQ_init(cnt,k); int L,R; while(q--){ cin>>L>>R; --L,--R; if(num[L]==num[R]) cout<<R-L+1<<endl; else { int ans=max(r[L]-L+1,R-l[R]+1); if(num[R]-num[L]>1) ans=max(ans,RMQ(num[L]+1,num[R]-1)); cout<<ans<<endl; } } } }
原文地址:https://www.cnblogs.com/033000-/p/10313719.html