【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; }
相关文章推荐
- poj 2452 RMQ(Sticks Problem)
- poj 2452(RMQ+二分)
- POJ 2452 Sticks Problem (暴力或者rmq+二分)
- POJ 2452 Sticks Problem(RMQ+二分)
- POJ 2452 Sticks Problem(二分+RMQ)
- POJ 2452 Sticks Problem [RMQ+二分]
- POJ 2452 Sticks Problem(二分+RMQ)
- poj2452 Sticks Problem RMQ问题
- poj-2452 Sticks Problem(二分+RMQ)
- POJ 题目2823 Sliding Window(RMQ,固定区间长度)
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- POJ 题目3368 ||HDOJ 题目1806 Frequent values(RMQ)
- POJ 3264 RMQ问题 ST算法
- POJ 2452 Sticks Problem
- Frequent values(POJ-1806)(RMQ)
- poj 2019(二维RMQ)
- POJ 3264 Balanced Lineup(RMQ)
- poj 2823 Sliding Window 【固定区间长度的RMQ】 【二维压缩成一维】
- poj 1330 Nearest Common Ancestors(LCA 基于二分搜索+st&rmq的LCA)
- Frequent values - POJ 3368 RMQ