#include<stdio.h>

#include<string.h>

#define N  1100000

int a[N];

int fmin[N],fmax[N];

int tmin[N],tmax[N];

int dicmax(int l,int r,int f[],int k) {

    int mid;

     while(l<=r) {

        mid=(l+r)/2;

        if(k>=f[mid])//

            r=mid-1;

        else

            l=mid+1;

     }

     return l;//这里的r返回第一个大于k的数的位置-1

}

int dicmin(int l,int r,int f[],int k) {

  int mid;

  while(l<=r) {

    mid=(l+r)/2;

    if(k<=f[mid])

        r=mid-1;

    else

        l=mid+1;

  }

  return l;//

}

int main() {

   int n,k,i,j,front,end;

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

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

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

     front=end=1;

     fmin[front]=a[1];

     tmin[front]=1;

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

        end=dicmin(front,end,fmin,a[i]);

     //   printf("%d\n",end);

        fmin[end]=a[i];

        tmin[end]=i;

     }

     printf("%d",fmin[front]);

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

       end=dicmin(front,end,fmin,a[i]);

        fmin[end]=a[i];

        tmin[end]=i;

        while(tmin[front]<i-k+1&&front<=end)

            front++;

        printf(" %d",fmin[front]);

     }

     printf("\n");

     front=end=1;

     fmax[1]=a[1];

     tmax[1]=1;

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

        end=dicmax(front,end,fmax,a[i]);

        fmax[end]=a[i];

        tmax[end]=i;

     }

      printf("%d",fmax[front]);

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

        end=dicmax(front,end,fmax,a[i]);

        fmax[end]=a[i];

        tmax[end]=i;

        while(tmax[front]<i-k+1&&front<=end)

            front++;

        printf(" %d",fmax[front]);

     }

     printf("\n");

   }

return 0;}

poj 2823 二分法+单调队列的更多相关文章

  1. POJ 2823【单调队列】

    题意: 给出序列,找出每个连续长度为k的子序列的最大值和最小值. 思路: 裸单调队列... 单调队列这东西用的真的非常局限,大概只能用到这种情景中== 简单说一下维护: 添加元素,为了保持单调性,排除 ...

  2. poj 1821 Fence 单调队列优化dp

    /* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...

  3. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  4. POJ 1742 Coins ( 单调队列解法 )

    id=1742" target="_blank">题目链接~~> 做题感悟:第一次做的时候用的二进制优化.可是没注意到是险过.so也没去看单调队列的解法. 解 ...

  5. Dividing the Path POJ - 2373(单调队列优化dp)

    给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...

  6. 刷题总结——Cut the Sequence(POJ 3017 dp+单调队列+set)

    题目: Description Given an integer sequence { an } of length N, you are to cut the sequence into sever ...

  7. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  8. POJ 1742 (单调队列优化多重背包+混合背包)

    (点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...

  9. POJ 2823 Sliding Window + 单调队列

    一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1)   从队首删除 (2)   从队尾删除 (3)   从队尾插入 (4)   ...

随机推荐

  1. 微信小程序去除button边框

    button::after{ border: none; } 去button的背景

  2. Hdu 4612 Warm up (双连通分支+树的直径)

    题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...

  3. Android 性能优化(24)*性能工具之「Traceview,dmtracedump」Profiling with Traceview and dmtracedump :记录并查看函数调用栈*

    Profiling with Traceview and dmtracedump In this document Traceview Layout         Traceview工具界面介绍 T ...

  4. Visual Studio 相关

    基础配置: 背景色:豆沙绿(色调84 饱和度118 亮度205) 字体字号:Consolas 11号  离线下载方法: vs_enterprise.exe --layout c:\vs2017offl ...

  5. 支持多种格式的播放器js代码

    FLV需要播放器,其它视频格式直接插入相应的代码即可. ------------------------------------- /**   *视频播放 by zhensheng@   *参数说明  ...

  6. mybatis使用中类属性名和数据库表字段名问题

    起初我以为上述二者必须一致,后来发现也是可以像Hibernate那样在xml文件中进行映射的. <mapper namespace="com.tenghu.mybatis.model. ...

  7. ubantu MongoDB安装

    转 https://blog.csdn.net/flyfish111222/article/details/51886787 本博文介绍了MongoDB,并详细指引读者在Ubuntu下MongoDB的 ...

  8. 关于c++11中static类对象构造函数线程安全的验证

    在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看c++:自己动手实现线程安全的c+ ...

  9. Lazarus 日志工具 MultiLog

    MultiLog是一种同时以灵活性和低开销为目标的日志系统.顾名思义,它可用于将日志实例到多个目标,如文本文件.可视控件或其他应用程序.添加新的日志目标使用两个方法就可以实现了,其中一个方法是可选的. ...

  10. SQL删除重复数据(根据多个字段),pandas的nan存入数据库报错

    delete from M_FACTOR_DATA_TEST a where (a.factor_id,a.data_date,a.stock_code) in (select factor_id,d ...