POJ-3264(标准RMQ)

本题为标准RMQ问题,仍然用Sparse Table


#include <stdio.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

int N, Q;
int m[200000][18];
int M[200000][18];

int main()
{
    int i, j, k, L, R;
/* input */    
    scanf("%d%d", &N, &Q);
    for(i = 0; i < N; ++i){
        scanf("%d", &m[i][0]);
        M[i][0] = m[i][0];
    }
/* get minimum/maximum value in range 2^1 ~ 2^log2(N) */
    for(j = 0; (k = 1 << (j+1)) < N; ++j){
        for(i = 0; i + k <= N; ++i){
            m[i][j+1] = min(m[i][j], m[i+(1<<j)][j]);
            M[i][j+1] = max(M[i][j], M[i+(1<<j)][j]);
        }
    }
/* get maximum - minimum within given range */
    while(Q--){
        scanf("%d%d", &L, &R);
        if(L == R){
            puts("0");
            continue;
        }
        --L; --R;
        k = R - L + 1;
        for(j = 0; (1 << (j+1)) < k; ++j) ;
        printf("%d\n", max(M[L][j], M[L + k - (1 << j)][j]) - 
                       min(m[L][j], m[L + k - (1 << j)][j]));
    }
    
    return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值