静态RMQ模板题 contest 静态RMQ T2

Posted virtual-north-illya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态RMQ模板题 contest 静态RMQ T2相关的知识,希望对你有一定的参考价值。

Description

Wind设计了很多机器人。但是它们都认为自己是最强的,于是,一场比赛开始了。机器人们都想知道谁是最敏捷的,于是它们进行了如下一个比赛。首先,他们面前会有一排共n个数,它们比赛看谁能最先把每连续k个数中最大和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快。但是Wind也想知道答案,你能帮助他吗?

Input

每组测试数据,第1行为n,k,第2行共n个数,为数字序列,所有数字均在longint范围内。

Output

共n-k+1行 第i行为第i—i+k-1这k个数中的最大和最小值

Hint

1<=k<=n<=100000

Solution

静态RMQ模板题,数据比较水,规范一点的话还是要用long long,不过用int在oj上也能过,下面的代码是没用long long的。
技术分享图片

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int f_min[maxn][25],f_max[maxn][25],LoG[maxn],a[maxn];
int n,m,x,ans_min,ans_max,k;
void setlog_(){
    LoG[1]=0;
    for(int i=2;i<=maxn-1;i++){
        LoG[i]=LoG[(i>>1)]+1;
    }
}
void setf_max(){
    for(int i=1;i<=n;i++){
        f_max[i][0]=a[i];
    }
    for(int j=1;j<=LoG[n];j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            f_max[i][j]=max(f_max[i][j-1],f_max[i+(1<<(j-1))][j-1]);
        }
    }
}
void setf_min(){
    for(int i=1;i<=n;i++){
        f_min[i][0]=a[i];
    }
    for(int j=1;j<=LoG[n];j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            f_min[i][j]=min(f_min[i][j-1],f_min[i+(1<<(j-1))][j-1]);
        }
    }
}
int main(){
    setlog_();
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    setf_max();
    setf_min();
    for(int i=1;i+k-1<=n;i++){
        ans_max=max(f_max[i][LoG[k]],f_max[(i+k-1)-(1<<LoG[k])+1][LoG[k]]);
        ans_min=min(f_min[i][LoG[k]],f_min[(i+k-1)-(1<<LoG[k])+1][LoG[k]]);
        printf("%d %d
",ans_max,ans_min);
    }
    return 0;
}

以上是关于静态RMQ模板题 contest 静态RMQ T2的主要内容,如果未能解决你的问题,请参考以下文章

静态区间(RMQ问题)(st表)

P3865 模板ST 表又称RMQ

RMQ 模板题 poj 3264

POJ 3264:Balanced Lineup(RMQ模板题)

杭电2018多校第一场(2018 Multi-University Training Contest 1) 1008.RMQ Similar Sequence (HDU6305) -笛卡尔树+数学期望

poj1986 LCA转化为RMQ在线算法模板题