标签:poj 3368 frequent values rmq+离散化
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define maxn 100005 int n,q; int a[maxn],dp[maxn][30]; int value[maxn],cnt[maxn],l[maxn],r[maxn],has[maxn],ll[maxn],rr[maxn]; void init_rmq(int n){ for(int i=1;i<n;i++)dp[i][0]=cnt[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<(j-1))-1<n;i++) dp[i][j]=max(dp[i][j-1],dp[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(dp[l][k],dp[r-(1<<k)+1][k]); } int main() { int u,v; //freopen("in.txt","r",stdin); while(~scanf("%d",&n)&&n){ scanf("%d",&q); scanf("%d",&a[1]); int id=1; memset(value,0,sizeof value); memset(cnt,0,sizeof cnt); value[id]=a[1]; cnt[id]++; has[1]=id; l[id]=1; r[id]=1; for(int i=2;i<=n;i++){ scanf("%d",&a[i]); if(a[i]==a[i-1]){ cnt[id]++; } else { id++; l[id]=i; value[id]=a[i]; cnt[id]++; } has[i]=id; r[id]=i; } for(int i=1;i<=n;i++){ ll[i]=l[has[i]]; rr[i]=r[has[i]]; } /* for(int i=1;i<=n;i++){ cout<<has[i]<<" "; } cout<<endl; */ init_rmq(id); for(int i=0;i<q;i++){ scanf("%d%d",&u,&v); if(has[u]==has[v])printf("%d\n",v-u+1); else { int max1=rr[u]-u+1; //若不设置ll[]的话,则直接用l[has[u]]即可 int max2=v-ll[v]+1; int max3=0; if(has[v]-has[u]>1){ max3=rmq(has[u]+1,has[v]-1); } printf("%d\n",max(max(max1,max2),max3)); } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:poj 3368 frequent values rmq+离散化
原文地址:http://blog.csdn.net/u013497977/article/details/47374663