滑动窗口_单调队列入门 (白书P241)
来源:互联网 发布:占领中环 知乎 编辑:程序博客网 时间:2024/05/17 03:40
#include <iostream>#include <fstream>using namespace std;#define MAX 1000001int A[MAX]; //存储数据int Q[MAX]; //队列int P[MAX]; //存储A[i]中的下标iint Min[MAX]; //输出最小int Max[MAX]; //输出最大int n,k;void get_min(){ int i; int head=1,tail=0; for(i=0; i<k-1; i++) //先把前两个入队 { while(head<=tail && Q[tail]>=A[i]) //队尾元素大于要插入的数 --tail; Q[++tail]=A[i]; P[tail]=i; } for(; i<n; i++) { while(head<=tail && Q[tail]>=A[i]) --tail; Q[++tail]=A[i]; P[tail]=i; while(P[head]<i-k+1) //判断数是否过时,即窗口是否已经划过这个数,我这是从0开始计数的。 { head++; } Min[i-k+1]=Q[head]; }}void get_max(){ int i; int head=1,tail=0; for(i=0; i<k-1; i++) { while(head<=tail && Q[tail]<=A[i]) //队尾元素小于要插入的值 --tail; Q[++tail]=A[i]; P[tail]=i; } for(; i<n; i++) { while(head<=tail && Q[tail]<=A[i]) //队尾元素小于要插入的值 --tail; Q[++tail]=A[i]; P[tail]=i; while(P[head]<i-k+1) { head++; } Max[i-k+1]=Q[head]; }}void output(){ int i; //输出最下值 for(i=0; i<n-k+1; i++) { if(i==0) printf("%d",Min[i]); else printf(" %d",Min[i]); } printf("\n"); //输出最大值 for(i=0; i<n-k+1; i++) { if(i==0) printf("%d",Max[i]); else printf(" %d",Max[i]); } printf("\n");}int main(){ int i; // freopen("acm.txt","r",stdin); scanf("%d%d",&n,&k); for(i=0; i<n; i++) { scanf("%d",&A[i]); } get_min(); get_max(); output(); return 0;}
0 0
- 滑动窗口_单调队列入门 (白书P241)
- 滑动窗口--单调队列
- 单调队列--滑动窗口
- poj2823(滑动窗口,单调队列模板)
- POJ2823 滑动窗口 单调队列
- 入门经典_Chap08_题解总结:极角扫描法 滑动窗口 单调队列 单调栈
- openjudge滑动窗口(单调递增递减队列)
- 窗口(单调队列)
- 滑动窗口(单调队列)讲解_legend
- 【大渣】【单调队列】滑动窗口
- 单调队列——滑动窗口
- poj 2823 滑动窗口 单调队列
- 数组滑动窗口中的最大值[单调队列]
- sliding window 滑动窗口(单调队列)
- 【例题&结论】【单调队列(滑动窗口)】NKOJ2152 滑动窗口
- POJ 2823 (从经典滑动窗口最大值问题入门单调队列)
- POJ 2823 Sliding Window(滑动窗口问题__优先队列||单调队列)
- POJ2823 滑动窗口中元素的最值(单调队列)
- PAT(B) 1021. 个位数统计(简单哈希)
- 替换空格
- HDU 4274 - Spy's Work(树形DP)
- 第2周项目0-宣告“主权” 初识数据结构
- Android 使用极光推送自定义消息打造个性的消息推送效果
- 滑动窗口_单调队列入门 (白书P241)
- 二分查找
- 电话本管理系统(使用数组)
- Hello JSP!——<jsp:include>动作元素篇
- 问题记录
- LeetCode Delete Node in a Linked List
- JDK5至JDK8的新特性
- 正则表达式炼级攻略
- Spring mvc的相关问题