【RMQ】POJ 2452

來源:互聯網
上載者:User

#define N 50010int a[N];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][N];//dp[i][j]表示從j開始,長度為2^i區間最大值(最小值)int dp2[20][N];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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.