| Time Limit: 12000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
| Window position | Minimum value | Maximum value |
|---|---|---|
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
题意:有n个数,每次从左到右选取k个数,第一行选取每个区间中的最小值输出,第二行每次选取区间中的最大值输出。
分析:RMQ求解。题目数据量比较大,如果用一般的二维数组显然是要MLE的,由于此题是固定的区间长度,所以只要用一维数组即可,第二维可以省略。
题目链接:http://poj.org/problem?id=2823
代码清单:
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<cstdio>
#include<string>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
const int maxn = 1e6 + 5;
int n,k;
int a[maxn];
int minq[maxn];
int maxq[maxn];
void input(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
void RMQ_ST(){
int L=(int)((log(k*1.0))/(log(2.0)));
for(int i=1;i<=n;i++) minq[i]=maxq[i]=a[i];
for(int j=1;j<=L;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
minq[i]=min(minq[i],minq[i+(1<<(j-1))]);
maxq[i]=max(maxq[i],maxq[i+(1<<(j-1))]);
}
}
}
void solve(){
RMQ_ST();
int mi=(int)((log(k*1.0))/(log(2.0)));
for(int i=1;i+k-1<=n;i++){
printf("%d%c",min(minq[i],minq[i+k-(1<<mi)]),i+k-1==n?'\n':' ');
}
for(int i=1;i+k-1<=n;i++){
printf("%d%c",max(maxq[i],maxq[i+k-(1<<mi)]),i+k-1==n?'\n':' ');
}
}
int main(){
input();
solve();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/47843849