标签:des style blog class code c
| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 36469 | Accepted: 10803 | |
| Case Time Limit: 5000MS | ||
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
Source
求每一个长度为k的区间的最大值,最小值,把它们都输出来。
与上面的那道很类似,用两个单调队列,一个递增,一个递减,然后从左向右扫描一遍即可。
POJ G++ tle,C++勉强ac,卡时较严重。
代码:
/* ***********************************************
Author :_rabbit
Created Time :2014/5/12 23:07:15
File Name :20.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
int a[1001000],que1[1001000],que2[1001000],ans1[1001000],ans2[1000100];
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int n,k;
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int head=1,end=k,front1=0,tail1=0,front2=0,tail2=0;
for(int i=1;i<=k;i++){
while(front1<tail1&&a[que1[tail1-1]]>a[i])tail1--;//递增序列
que1[tail1++]=i;
while(front2<tail2&&a[que2[tail2-1]]<a[i])tail2--;//递减序列
que2[tail2++]=i;
}
ans1[1]=a[que1[front1]];ans2[1]=a[que2[front2]];
for(int i=k+1;i<=n;i++){
head=i-k+1;end=i;
while(front1<tail1&&a[que1[tail1-1]]>a[i])tail1--;
que1[tail1++]=i;
while(que1[front1]<head)front1++;
ans1[i-k+1]=a[que1[front1]];
while(front2<tail2&&a[que2[tail2-1]]<a[i])tail2--;
que2[tail2++]=i;
while(que2[front2]<head)front2++;
ans2[i-k+1]=a[que2[front2]];
}
for(int i=1;i<=n-k+1;i++)printf("%d%c",ans1[i],i==n-k+1?‘\n‘:‘ ‘);
for(int i=1;i<=n-k+1;i++)printf("%d%c",ans2[i],i==n-k+1?‘\n‘:‘ ‘);
}
return 0;
}
标签:des style blog class code c
原文地址:http://blog.csdn.net/xianxingwuguan1/article/details/25660253