您的位置:首页 > 其它

【RMQ】POJ 2452

2012-02-07 15:17 246 查看
#define N 50010
int a
;
int max(int i,int j){return a[i]>a[j]?i:j;}
int min(int i,int j){return a[i]>a[j]?j:i;}
int dp1[20]
;//dp[i][j]表示从j开始,长度为2^i区间最大值(最小值)
int dp2[20]
;
int n,m;
void init_rmq(){
int i,j;
for(i=1;i<=n;i++){
dp1[0][i] = i;
dp2[0][i] = i;
}
int t = floor(log((double)n)/log(2.0));//向下取整
for(i=1;i<=t;i++){
for(j=1;j+(1<<(i-1))<=n;j++){
dp1[i][j] = max(dp1[i-1][j],dp1[i-1][j+(1<<(i-1))]);
dp2[i][j] = min(dp2[i-1][j],dp2[i-1][j+(1<<(i-1))]);
}
}
}
int rmq(int l,int r,int s){
int k = floor(log((r-l+1)*1.0)/log(2.0));
if(s==1){
return max(dp1[k][l],dp1[k][r-(1<<k)+1]);
} else return min(dp2[k][l],dp2[k][r-(1<<k)+1]);
}
int gao(int x){
int l = 1,r = x-1,mid;
while(l<r){
mid = (l+r)>>1;
if(a[rmq(mid,r,1)]<a[x])r = mid-1;
else l = mid+1;
}
return rmq(l,x,2);
}
int main(){FRE;
while(scanf("%d",&n) != -1){
int i,j;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
init_rmq();
int ans = 0;
for(i=1;i<=n;i++){
int t = i-gao(i);
if(ans<t)ans = t;
}
if(ans<1)ans=-1;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: