#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃

#define N  1100000

int getmin[N],getmax[N],num[N],n,k,a[N];

int main(){

int i,first,last;

while(scanf("%d%d",&n,&k)!=EOF) {

for(i=1;i<=n;i++)

scanf("%d",&a[i]);

first=1;last=1;

getmin[first]=a[1];

num[first]=1;

for(i=2;i<=k;i++) {

while(a[i]<=getmin[last]&&first<=last)

last--;

getmin[++last]=a[i];

num[last]=i;

}

printf("%d",getmin[first]);

for(i=k+1;i<=n;i++) {

while(a[i]<=getmin[last]&&first<=last)//碰到相等也要改变因为他生命长

last--;

getmin[++last]=a[i];

num[last]=i;

while(num[first]<i-k+1&&first<=last)//如果没有在要求的范围内就舍弃

first++;

printf(" %d",getmin[first]);

}

printf("\n");

first=1;last=1;

getmax[first]=a[1];

num[first]=1;

for(i=2;i<=k;i++) {

while(a[i]>=getmax[last]&&first<=last)

last--;

getmax[++last]=a[i];

num[last]=i;

}

printf("%d",getmax[first]);

for(i=k+1;i<=n;i++) {

while(a[i]>=getmax[last]&&first<=last)

last--;

getmax[++last]=a[i];

num[last]=i;

while(num[first]<i-k+1&&first<=last)

first++;

printf(" %d",getmax[first]);

}

printf("\n");

}

return 0;

}

//二分法

#include<stdio.h>

struct node {

int index,f;

}pmax[1100000],pmin[1100000];

int a[1100000];

int qiulinjie(int front ,int last,int d) {

int mid;

while(front<=last) {

mid=(front+last)/2;

if(pmin[mid].f==d)

return mid;

else

if(pmin[mid].f>d)

last=mid-1;

else

front=mid+1;

}

return front;

}

int qiulinjie1(int front ,int last,int d) {

int mid;

while(front<=last) {

mid=(front+last)/2;

if(pmax[mid].f==d)

return mid;

else

if(pmax[mid].f<d)

last=mid-1;

else

front=mid+1;

}

return front;

}

int main() {

int front,last,i,j,k,n,m;

while(scanf("%d%d",&n,&k)!=EOF) {

for(i=1;i<=n;i++)

scanf("%d",&a[i]);

front=last=1;

pmin[front].index=1;

 pmin[last].f=a[1];

 for(i=2;i<=k;i++) {

 last=qiulinjie(front,last,a[i]);

 pmin[last].index=i;

 pmin[last].f=a[i];

 }

 printf("%d",pmin[front].f);

 for(;i<=n;i++) {

 last=qiulinjie(front,last,a[i]);

 pmin[last].index=i;

 pmin[last].f=a[i];

 while(i-pmin[front].index>=k)

 front++;

 printf(" %d",pmin[front].f);

 }

printf("\n");









front=last=1;

pmax[front].index=1;

 pmax[front].f=a[1];

 for(i=2;i<=k;i++) {

 last=qiulinjie1(front,last,a[i]);

 pmax[last].index=i;

 pmax[last].f=a[i];

 }

 printf("%d",pmax[front].f);

 for(;i<=n;i++) {

 last=qiulinjie1(front,last,a[i]);

 pmax[last].index=i;

 pmax[last].f=a[i];

 while(i-pmax[front].index>=k)

 front++;

 printf(" %d",pmax[front].f);

 }

 printf("\n");

}

 return 0;

}

poj 2823单调队列模板题的更多相关文章

  1. Sliding Window POJ - 2823 单调队列模板题

    Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...

  2. caioj 1172 poj 2823 单调队列过渡题

    给定一个n个数的数列,从左至右输出每个长度为m的数列段内的最大数. 输入:第一行两个整数n和m( 1<= n <= 20 0000,m<=n).下来给出n个整数. 输出:一行一个整数 ...

  3. POJ 2823 Sliding Window​ (模板题)【单调队列】

    <题目链接> <转载于>>> > 题目大意: 给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和 ...

  4. luoguP1886 滑动窗口(单调队列模板题)

    题目链接:https://www.luogu.org/problem/P1886#submit 题意:给定n个数,求大小为k的滑动窗口中最小值和最大值. 思路:单调队列模板题. AC代码: #incl ...

  5. POJ 2823 单调队列入门水题

    最最基础的单调队列题目.一个单增一个单减.还是可以借此好好理解一下单调队列的. #include <stdio.h> #include <string.h> #include ...

  6. poj 2823 单调队列

    思路:裸的单调队列. #include<iostream> #include<cstring> #include<cstdio> #include<algor ...

  7. hdu3415 单调队列模板题

    比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...

  8. POJ 2823 滑动窗口 单调队列模板

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...

  9. POJ 2823 Sliding Window(单调队列入门题)

      Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 67218   Accepted: 190 ...

随机推荐

  1. P3349 [ZJOI2016]小星星

    传送门 题意都需要看题解才能明白我是不是已经废了 题意就是求一个从树\(S\)到图\(T\)的映射,满足若树上的两个点有边,则它们映射在图中的两个点也连有边,且不能有多个点映射到同一个点 我们先不考虑 ...

  2. ACM_四数之和

    四数之和 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个不同的整数,判断能否从中选4次,4个数和刚好为m.数字可重复选取. ...

  3. 258 Add Digits 各位相加

    给一个非负整数 num,反复添加所有的数字,直到结果只有一个数字.例如:设定 num = 38,过程就像: 3 + 8 = 11, 1 + 1 = 2. 由于 2 只有1个数字,所以返回它.进阶:你可 ...

  4. 关于.Net中Process的使用方法和各种用途汇总(一):Process用法简介

    简介: .Net中Process类功能十分强大.它可以接受程序路径启动程序,接受文件路径使用默认程序打开文件,接受超链接自动使用默认浏览器打开链接,或者打开指定文件夹等等功能. 想要使用Process ...

  5. 数据库恢复挂起解决办法【MSSQL】

    新建查询输入如下代码运行 - -把test改成你需要修复的数据库名 USE master GO ALTER DATABASE test SET SINGLE_USER GO ALTER DATABAS ...

  6. Java编程思想读书笔记_第7章

    final关键字类似const: import java.util.*; public class FinalData { static Random rand = new Random(47); f ...

  7. Farseer.net轻量级开源框架 入门篇:修改数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...

  8. 网络编程基础_3.APC队列

    APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...

  9. 扩增子分析QIIME2-3数据导出Exporting data

    # 激活工作环境 source activate qiime2-2017.8 # 建立工作目录 mkdir -p qiime2-exporting-tutorial cd qiime2-exporti ...

  10. CAD得到所有实体方法(网页版)

    主要用到函数说明: IMxDrawSelectionSet::AllSelect 得到当前空间的所有实体.详细说明如下: 参数 说明 [in,defaultvalue(NULL)] IMxDrawRe ...