POJ2823Sliding Window

Sliding Window

Time Limit: 12000MS   Memory Limit: 65536K
Total Submissions: 49919   Accepted: 14391
Case Time Limit: 5000MS

Description

An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example: 
The array is [1 3 -1 -3 5 3 6 7], and k is 3.

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

The input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line.

Output

There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.

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

题意:模拟滑动窗口,每k个数,输出最大值最小值单调队列:从这里学来的http://m.blog.csdn.net/blog/lx417147512/24916441

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <string.h>
 6 using namespace std;
 7 const int N = 10000000 + 10;
 8 int num[N],Max[N],Min[N],Increase[N],Decrease[N];
 9 int pre1,pre2,lst1,lst2,len_max,len_min,n,k;
10 void in_Max(int i)
11 {
12     while(pre1 <= lst1 && num[i] > num[ Increase[lst1] ])
13         lst1--;
14     Increase[++lst1] = i;
15     if(i >= k)
16     {
17         if(Increase[pre1] <= i - k)
18             pre1++;
19         Max[len_max++] = num[ Increase[pre1] ];
20     }
21 }
22 void in_Min(int i)
23 {
24     while(pre2 <= lst2 && num[i] < num[ Decrease[lst2] ])
25         lst2--;
26     Decrease[++lst2] = i;
27     if(i >= k)
28     {
29         if(Decrease[pre2] <= i - k)
30             pre2++;
31         Min[len_min++] = num[ Decrease[pre2] ];
32     }
33 }
34 int main()
35 {
36     while(scanf("%d%d", &n,&k) != EOF)
37     {
38         pre1 = pre2 = len_max = len_min = 0;
39         lst1 = lst2 = -1;   //注意这个要设成-1
40         for(int i = 1; i <= n; i++)
41         {
42             scanf("%d",&num[i]);
43             in_Max(i);
44             in_Min(i);
45         }
46         printf("%d",Min[0]);
47         for(int i = 1; i < len_min; i++)
48             printf(" %d",Min[i]);
49         printf("\n");
50         printf("%d",Max[0]);
51         for(int i = 1; i < len_max; i++)
52             printf(" %d",Max[i]);
53         printf("\n");
54     }
55     return 0;
56 }

时间: 2024-10-08 00:32:42

POJ2823Sliding Window的相关文章

【单调队列】POJ2823-Sliding Window

单调队列经典题之一. [思路] 设置两个单调队列分别记录最大值和最小值.对于每一个新读入的数字,进行两次操作(对于求最大值和最小值中的某一个而言),一是若队首不在滑窗范围内则删去:二是删去队末比当前值小(或大)的值,并将当前值插入对尾.每一次的最小(大)值就是当前单调队列的队首. [错误点] 一定要写while (scanf("%d%d",&n,&k)!=EOF),否则会WA. 我一开始的做法是这样的:先把第一个数插入队尾,再从第二个数开始进行后续操作.这样的问题在于如

poj2823Sliding Window——单调队列

题目:http://poj.org/problem?id=2823 单调队列模板. 代码如下: #include<iostream> #include<cstdio> using namespace std; int n,k,a[1000005],mx[1000005],mn[1000005]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d&

window.open被浏览器拦截的解决方案

现象 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,搞得人无比郁闷啊,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多小白根本不知道发生了啥,不知道在哪里看被拦截的页面,简直悲催啊~~. 另外,可以发现,当window.open为用户触发事件内部或者加载时,不会被拦截,一旦将弹出代码移动到ajax或者一段异步代码内部,马上就出现被拦截的表现了. 原因分析&深入研究 当浏览器检测到非用户操作产生的新弹出窗口,则会对其进行阻

关于js中window.location.href,location.href,parent.location.href,top.location.href的用法

关于js中window.location.href,location.href,parent.location.href,top.location.href的用法 "window.location.href"."location.href"是本页面跳转. "parent.location.href" 是上一层页面跳转. "top.location.href" 是最外层的页面跳转. 举例说明: 如果A,B,C,D都是html,D

window对象的几个重要方法

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>JavaScript window对象常用方法及事件</title><script type="text/javascript"> window.onload=function(){//文档加载完成后执行此方法   alert("文档加载完毕了"); }

js 完全分离 window.onload=

js 完全分离  window.onload= <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>TAB菜单</title> <script type="text/javascript"

Js中的window.parent ,window.top,window.self详解

在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口. window.self 功能:是对当前窗口自身的引用.它和window属性是等价的. 语法:window.self 注:window.self.window.self是等价的. window.top 功能:返回顶层窗口,即浏览器窗口. 语法:window.top 注:如果窗

JS的window对象详解

一.说明 他是JS中最大的对象,它描述的是一个浏览器窗口,一般要引用他的属性和方法时,不需要用"Window.XXX"这种形式,而是直接使用"XXX".一个框架页面也是一个窗口. 二.Window窗口对象有如下属性 1.name 窗口的名称,由打开它的连接(<a target="...">)或框架页(<frame name="...">)或某一个窗口调用的 open() 方法(见下)决定.一般我们不会用

QT Demo 之 window(5) window.qml

在分析了main.cpp.Splash.Qt.quit()以及ScreenInfo之后,我们终于开始了正题:window.qml. window.qml的主体结构 window.qml主体是一个QtObject,其中包含了4个子元素:palette.controlWindow.testWindow和splashWindow: QtObject { property real defaultSpacing: 10 property SystemPalette palette: SystemPale