poj 3264 Balanced Lineup【ST算法(解区间最值)】

来源:互联网 发布:女士棉袄淘宝网 编辑:程序博客网 时间:2024/05/16 19:48

http://poj.org/problem?id=3264

题意:

题解:

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int N = 50050;int n,m,h[N],m1[N][16],m2[N][16];//m1(max);m2(min)void init() {    for(int i=1;i<=n;i++) m1[i][0]=m2[i][0]=h[i];    int k = floor(log((double)n)/log(2.0));    for(int i=1;i<=k;i++)    for(int j=n;j>=1;j--) {        int jj = j + (1<<(i-1));        m1[j][i] = m1[j][i-1];        m2[j][i] = m2[j][i-1];        if(jj <= n) {            m1[j][i] = max(m1[j][i-1],m1[jj][i-1]);            m2[j][i] = min(m2[j][i-1],m2[jj][i-1]);        }    }}int rmq(int l,int r) {    int k = floor(log((double)(r-l+1))/log(2.0));    int mx = max(m1[l][k],m1[r-(1<<k)+1][k]);    int mi = min(m2[l][k],m2[r-(1<<k)+1][k]);    return mx - mi;}int main() {    int l , r;    while(~scanf("%d%d",&n,&m)) {        for(int i=1;i<=n;i++) scanf("%d" , &h[i]);        init();        while(m--) {            scanf("%d%d",&l,&r);            printf("%d\n",rmq(l , r));        }    }    return 0;}


原创粉丝点击