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;
    }
  • 相关阅读:
    Activity与Fragment间的通信
    Activity生命周期.lanchMode.保存状态
    网络知识
    Android内存优化(使用SparseArray和ArrayMap代替HashMap)
    进程/线程死锁产生的原因以及如何避免死锁
    Android UI框架基本概念
    android在线源码
    y音频学习
    给 Android 开发者的 RxJava 详解
    设计模式之观察者模式
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6836732.html
Copyright © 2011-2022 走看看