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

    维护一个队头和队尾

    单调队列的性质  单调  

    时间  n   

    这边讲维护小的

    因为维护单调  从队尾进去    经过 

     w    1  3  -1 -3  3  3   6   7

    ind   1  2  3  4   5  6   7    8               k=3

    初始话一下

    头  w      1                    尾  

         ind    1           

      w         1     3             因为3比1 大 放在后面

     ind        1     2

      w         1     3                 然后要加入-1  比较  比前面2个都小   所以      -1   

       ind      1     2                                                                               3

    初始化也就完成了

    接下来其实每个入队就和初始化差不多  判断是否比当前的大  大的话 pop  最后放进去 

    然后因为每次队头都是最小的  那么只要这个合法就行了  如果这个下标不在 那个k内 就去掉 

    最大的同理

    #include<stdio.h>
    #include<algorithm>
    #include<stdlib.h>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<iterator>
    #include<stack>
    
    using namespace std;
    
    #define ll   __int64
    #define MAXN  2000010
    #define inf  2000000007
    #define mod 1000000007
    int z[MAXN];
    struct
    {
        int w,ind;
    }q[MAXN];
    int mx[MAXN];
    int mi[MAXN];
    
    int main()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        int sz=1;
        int fr=1;
        q[1].w=z[1];
        q[1].ind=1;
        for(int i=2;i<k;i++)
        {
            while(sz>=fr&&q[sz].w>z[i])
                sz--;
            sz++;
            q[sz].w=z[i];
            q[sz].ind=i;
        }
        for(int i=k;i<=n;i++)
        {
            while(sz>=fr&&q[sz].w>z[i])
                sz--;
            sz++;
            q[sz].w=z[i];
            q[sz].ind=i;
            while(q[fr].ind<i-k+1)
                fr++;
            mi[i-k+1]=q[fr].w;
        }
        for(int i=1;i<n-k+1;i++)
            printf("%d ",mi[i]);
        printf("%d
    ",mi[n-k+1]);
        fr=1;
        sz=1;
        q[1].w=z[1];
        q[1].ind=1;
        for(int i=2;i<k;i++)
        {
            while(sz>=fr&&q[sz].w<z[i])
                sz--;
            sz++;
            q[sz].w=z[i];
            q[sz].ind=i;
        }
        for(int i=k;i<=n;i++)
        {
            while(sz>=fr&&q[sz].w<z[i])
                sz--;
            sz++;
            q[sz].w=z[i];
            q[sz].ind=i;
            while(q[fr].ind<i-k+1)
                fr++;
            mx[i-k+1]=q[fr].w;
        }
        for(int i=1;i<n-k+1;i++)
            printf("%d ",mx[i]);
        printf("%d
    ",mx[n-k+1]);
    
        return 0;
    }
  • 相关阅读:
    realplayer web播放器控件参数和函数
    几种技术语言简介!
    电子书标志设计,精品设计,形象设计,封面设计,宣传广告设计作品欣赏
    QuickCHM2.6出现了"不支持此接口"
    svchost.exe占用CPU 100%的解决方法
    [转]网站健康检查
    php新帮手 PHPMaker v5.0.1.0
    【OpenGL】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式
    UML用例图总结
    【转】Ogre的八叉树场景管理器OctreeSceneManager
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6678239.html
Copyright © 2011-2022 走看看