为了能到远方,脚下的每一步都不能少.|

Cai-Ges

园龄:7个月粉丝:0关注:0

P2251 质量检测

题目大意

给定长度为 N 的数组 A,定义数组 QQi=min{A1,A2,,Ai}。对于每个 i(1iNM+1),输出 QiM 是给定的常数。

样例

输入
10 4
16 5 6 9 5 13 14 20 8 12
输出
5
5
5
5
5
8
8

解决方法

发现题目是要获取每个区间内最小值,于是想到 ST表,板子稍作修改即可。

代码

#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100010], ST[100010][22], lg[100010];
int main() {
cin >> n >> m;
lg[0] = -1;
for (int i = 1; i <= n; i++) {
cin >> a[i];
lg[i] = lg[i / 2] + 1;
}
for (int i = 0; i <= n; i++) {
ST[i][0] = a[i];
//cout << ST[i][0] << endl;
}
for (int j = 1; j <= 17; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
ST[i][j] = min(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
}
}
int l = 1, r = m;
while (l <= n - m + 1 && r <= n) {
int t = lg[r - l + 1];
cout << min(ST[l][t], ST[r - (1 << t) + 1][t]) << endl;
l++, r++;
}
return 0;
}

本文作者:Cai-Ges

本文链接:https://www.cnblogs.com/Cai-Ges/p/18508090

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Cai-Ges  阅读(2)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起