zoukankan      html  css  js  c++  java
  • AC日记——Sliding Window poj 2823

    2823

    思路:

      单调队列;

      以前遇到都是用线段树水过;

      现在为了优化dp不得不学习单调队列了;

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    #define maxn 1000005
    struct QueueType {
        int x,dis;
    };
    struct QueueType mique[maxn],maque[maxn],ai[maxn];
    
    int n,k,mihead,mitail=-1,mahead,matail=-1;
    
    inline void in(int &now)
    {
        int if_z=1;now=0;
        char Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-') if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    
    int main()
    {
        in(n),in(k);
        for(int i=1;i<=n;i++) in(ai[i].dis),ai[i].x=i;
        for(int i=1;i<k;i++)
        {
            mique[++mitail]=ai[i];
            while(mitail>mihead)
            {
                if(mique[mitail].dis<=mique[mitail-1].dis) mique[mitail-1]=mique[mitail--];
                else break;
            }
            maque[++matail]=ai[i];
            while(matail>mahead)
            {
                if(maque[matail].dis>=maque[matail-1].dis) maque[matail-1]=maque[matail--];
                else break;
            }
        }
        for(int i=k;i<=n;i++)
        {
            mique[++mitail]=ai[i];
            while(mitail>mihead)
            {
                if(mique[mitail].dis<=mique[mitail-1].dis) mique[mitail-1]=mique[mitail--];
                else break;
            }
            printf("%d ",mique[mihead].dis);
            if(mique[mihead].x==i-k+1) mihead++;
        }
        printf("
    ");
        for(int i=k;i<=n;i++)
        {
            maque[++matail]=ai[i];
            while(matail>mahead)
            {
                if(maque[matail].dis>=maque[matail-1].dis) maque[matail-1]=maque[matail--];
                else break;
            }
            printf("%d ",maque[mahead].dis);
            if(maque[mahead].x==i-k+1) mahead++;
        }
        return 0;
    }
  • 相关阅读:
    OC-内存管理-基本原理与引用计数器
    OC-改错题
    OC-Q&A
    OC-SEL
    CO-类的本质、description方法
    Tomcat 下 mysql的连接池配置和使用
    转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
    使应用程序常驻内存,不能被任务管理器关闭之配置文件设置
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    >/dev/null 2>&1的含义
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6836732.html
Copyright © 2011-2022 走看看