POJ-2823(ST算法 + 滚动数组)

36 篇文章 0 订阅
5 篇文章 0 订阅

ST算法是求解RMQ问题最有效的方法之一,核心思想是以nlogn的复杂度递推f(i, 2^j) = min( f(i, 2^(j-1)), f(i + 2^(j-1), 2^(j-1)) ),其中f(i,2*j)表示arr[i, i + 2*j - 1]这个区间内的最小值

由于本题区间是确知的,所以递推时可以使用滚动数组来实现


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

int n, k;
int m[1000000], M[1000000];

int main()
{
    int i, j, t;
/* input */
    scanf("%d %d", &n, &k);
    for(i = 0; i < n; ++i){
        scanf("%d", &m[i]);
        M[i] = m[i];
    }
/* special judge */
    if(k == 1){
        printf("%d", m[0]);
        for(i = 1; i < n; ++i) printf(" %d", m[i]);
        putchar('\n');
        printf("%d", m[0]);
        for(i = 1; i < n; ++i) printf(" %d", m[i]);
        return 0;
    }
/* create sparse table with rolling array */
    k = min(k, n);
    for(j = 1; (t = j << 1) < k; j = t){
        for(i = 0; i + t <= n; ++i){
            m[i] = min(m[i], m[i + j]);
            M[i] = max(M[i], M[i + j]);
        }
    }
/* print result */
    j = k - j;
    printf("%d", min(m[0], m[j]));
    for(i = 1; i + k <= n; ++i) printf(" %d", min(m[i], m[i + j]));
    putchar('\n');
    printf("%d", max(M[0], M[j]));
    for(i = 1; i + k <= n; ++i) printf(" %d", max(M[i], M[i + j]));

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值