zoukankan      html  css  js  c++  java
  • C++ 单调队列

    最小值与最大值

    题目描述:有N(N<=7000000)个数,每次从左到右选取连续k个数,第一行选取每个区间中的最小值输出,第二行选取最大值并输出。

    输入

    输入第一行有两个整数N,k,第二行为N个整数,相邻两个整数之间有一个空格。

    输出

    输出有两行,第一行为N-k+1个整数,表示从左到右每个区间的最小值,第二行为N-k+1个整数,表示从左到右每个区间的最大值。

    【题解】 这个是典型的固定k区间的单调队列。套用的本质思想是,如求最小值: 考虑这样的一个问题,在某个区间当中如果存在某两个元素A,B,满足A的下标小于B的下标,A的值大于B的值,那么A这个数就可以删掉,不再考虑。求最大值反之。 具体的操作是:从加入第k个数开始,每插入做一次队列单调性更新: 删队尾【单调性】,入队,删队首【下标范围k以内】,输出队首【即最值】。

    代码:(1)

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int n,K,i,a[7000005];
    int q1[7000005],q2[7000005],ans1[7000005],ans2[7000005];
    int l1=1,l2=1,r1,r2;
    int main()
    {
    scanf("%d%d",&n,&K);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=1;i<=n;i++){
    while(l1<=r1&&q1[l1]<=i-K)l1++;
    while(l2<=r2&&q2[l2]<=i-K)l2++;
    while(l1<=r1&&a[i]<a[q1[r1]])r1--;
    q1[++r1]=i;
    while(l2<=r2&&a[i]>a[q2[r2]])r2--;
    q2[++r2]=i;
    ans1[i]=a[q1[l1]];
    ans2[i]=a[q2[l2]];
    }
    for(i=K;i<=n-1;i++)printf("%d ",ans1[i]);printf("%d ",ans1[n]);
    for(i=K;i<=n-1;i++)printf("%d ",ans2[i]);printf("%d",ans2[n]);
    return 0;
    }

    代码(2)

  • 相关阅读:
    php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别
    手机web——自适应网页设计(html/css控制)
    js正则表达式语法
    禁止鼠标右键的代码(转)
    php获取文件名称和扩展名
    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
    js中cookie的使用详细分析
    fopen中r+和w+的区别
    左右选择框 js插件
    SpringMVC 过滤器Filter使用解析
  • 原文地址:https://www.cnblogs.com/linzeli/p/6506823.html
Copyright © 2011-2022 走看看