zoukankan      html  css  js  c++  java
  • 【单调队列】POJ2823-Sliding Window

    单调队列经典题之一。

    【思路】

    设置两个单调队列分别记录最大值和最小值。对于每一个新读入的数字,进行两次操作(对于求最大值和最小值中的某一个而言),一是若队首不在滑窗范围内则删去;二是删去队末比当前值小(或大)的值,并将当前值插入对尾。每一次的最小(大)值就是当前单调队列的队首。

    【错误点】

    一定要写while (scanf("%d%d",&n,&k)!=EOF),否则会WA。

    我一开始的做法是这样的:先把第一个数插入队尾,再从第二个数开始进行后续操作。这样的问题在于如果滑窗大小为1,则第一个数无法被输出就出队,导致WA。故一定要先设置一个空队列,再逐一插入。

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int MAXN=1000000+10;
     5 int n,k,maxh,minh,maxt,mint; 
     6 int maxq[MAXN],minq[MAXN],num[MAXN];
     7 int maxans[MAXN],minans[MAXN];
     8 
     9 int main()
    10 {
    11     while (scanf("%d%d",&n,&k)!=EOF)
    12     {
    13         int maxhead=0,minhead=0,maxtail=0,mintail=0;
    14         for (int i=0;i<n;i++)
    15         {
    16             /*删除下标超出范围的队首元素*/ 
    17             if (maxhead<maxtail && maxq[maxhead]<=i-k) maxhead++;
    18             if (minhead<mintail && minq[minhead]<=i-k) minhead++;
    19             
    20             
    21             /*删除队尾元素*/ 
    22             scanf("%d",&num[i]);
    23             while (maxhead<maxtail && num[maxq[maxtail-1]]<=num[i]) maxtail--;maxtail++;
    24             maxq[maxtail-1]=i;
    25             while (minhead<mintail && num[minq[mintail-1]]>=num[i]) mintail--;mintail++;
    26             minq[mintail-1]=i;
    27             maxans[i]=num[maxq[maxhead]];
    28             minans[i]=num[minq[minhead]];            
    29         }
    30         for (int i=k-1;i<n;i++) cout<<minans[i]<<' ';cout<<endl;
    31         for (int i=k-1;i<n;i++) cout<<maxans[i]<<' ';cout<<endl;
    32     }
    33     return 0;
    34 }
  • 相关阅读:
    Oracle EBS 自治事务
    [转]Oracle GoldenGate安装配置
    [Oracle EBS R12]SQL Queries and Multi-Org Architecture in Release 12 (Doc ID 462383.1)
    LUN 和 LVM 知识
    [RAC] oracle rac 后台进程
    Manually connecting to the Oracle Linux Yum Server
    [转]ORACLE 绑定变量用法总结
    [转]分析函数计算移动平均的测试
    并发与多版本:update重启动问题
    WCF(二)三种通信模式
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4662835.html
Copyright © 2011-2022 走看看