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