#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. bzoj 1627: [Usaco2007 Dec]穿越泥地【bfs】

    在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 #include<iostream> #include<cstdio> #include&l ...

  2. AutoCAD VBA添加菜单

    # 给cad添加自定义菜单 Private Sub AddBar() Dim NewMenuItem As AcadPopupMenuItem Dim TheMacro As String Dim M ...

  3. 使用nginx加zuul配置

    配置文件 $ ls -lrt -rw-r--r-- 1 root root 826 May 10 10:56 nginx.conf $ pwd /etc/nginx 增加配置 在http {}里 up ...

  4. redis实际项目作用

    我整理一下redis主要在项目作用,只是我接触到的 1  手机验证码存入redis中,可以限制什么时候有效 2 防止接口请求频率过高,例如一分钟只能请求5次 代码如下: <?php /** * ...

  5. 【转】数据倾斜是多么痛?spark作业/面试/调优必备秘籍

    原博文出自于: http://sanwen.net/a/gqkotbo.html 感谢! 来源:数盟 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性 ...

  6. 13 继续C#中的方法,带返回值的方法介绍

    在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) ...

  7. Python在云端编程之IPython notebook

    Python在云端编程之IPython notebook 如果本地编程考虑到Python版本,机器位数,编译环境,科学栈安装等等繁琐的事,弄得你焦头烂额,不如移步云端,省去这些繁琐过程,在云端编程是很 ...

  8. viewpager滑动时页面不能刷新

    有一种解决方法就是覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过ge ...

  9. CAD使用GetxDataString读数据(网页版)

    主要用到函数说明: MxDrawEntity::GetxDataString2 读取一个字符扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...

  10. 关于ORB SLAM2资源整理(持续更新)

    ORB SLAM2源码讲解(吴博) https://www.youtube.com/watch?v=2GVE7FTW7AU 泡泡机器人视频整理: http://space.bilibili.com/3 ...