zoukankan      html  css  js  c++  java
  • poj2823滑动窗口

    这个是单调队列的入门题目。值得注意的一点是队列中的数的index是单调递增的,所以从队首删除的时候从前向后循环找到第一个index满足>= i - k + 1条件的元素作为队首元素就可以了,这也是我一开始没想明白的一点。

     1 //#include "stdafx.h"
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 int n, k, a[1000005], q[1000005];
     7 void max_value()
     8 {
     9     int front = 0, end = 0;
    10     for (int i = 0; i < n; i++)
    11     {
    12         while (a[q[end]] <= a[i] && end >= front)
    13         {
    14             end--;
    15         }
    16         q[++end] = i;
    17         while (q[front] < i - k + 1 && front < end)
    18         {
    19             front++;
    20         }
    21         if (i >= k - 1)
    22             printf("%d ", a[q[front]]);
    23     }
    24     puts("");
    25 }
    26 void min_value()
    27 {
    28     int front = 0, end = 0;
    29     for (int i = 0; i < n; i++)
    30     {
    31         while (a[q[end]] >= a[i] && end >= front)
    32         {
    33             end--;
    34         }
    35         q[++end] = i;
    36         while (q[front] < i - k + 1 && front < end)
    37         {
    38             front++;
    39         }
    40         if (i >= k - 1)
    41             printf("%d ", a[q[front]]);
    42     }
    43     puts("");
    44 }
    45 int main()
    46 {
    47     cin >> n >> k;
    48     for (int i = 0; i < n; i++)
    49     {
    50         scanf("%d", &a[i]);
    51     }
    52     min_value();
    53     memset(q, 0, sizeof(q));
    54     max_value();
    55     //system("pause");
    56     return 0;
    57 }
  • 相关阅读:
    建模算法(九)——拟合 (转)
    Swift初探一
    D3DXMatrixMultiply 函数
    魔术师发牌和拉丁方阵
    strip 命令的使用方法
    GDI编程小结
    Android多媒体-MediaRecorder 录制音视频
    Android 使用Gson解析json案例具体解释
    有依赖的背包问题(背包九讲)
    c++ 正則表達式
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6169362.html
Copyright © 2011-2022 走看看