zoukankan      html  css  js  c++  java
  • FZU_1894 志愿者选拔 【单调队列】

    1 题面

    FZU1894

    2 分析

      单调队列的典型引用

      需要注意的是在用维护辅助队列的时候,$L$和$R$的初始化都是0时,队列第一个数就是$L$,最后一个数就是$R-1$。

    3 AC代码

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    const int MAXN = 1e6 + 15;
    int MQue[MAXN], Que[MAXN];
    int L, R, LQ, RQ;
    
    void insert(int value)
    {
        Que[RQ++] = value;
        while(L != R && MQue[R-1] <= value)   R--;
        MQue[R++] = value;
    }
    
    int query()
    {
        if(L == R)
            return -1;
        else
            return MQue[L];
    }
    
    void pop()
    {
        //把辅助队列里的最大值去掉,因为这个值当前最大
        //辅助队列里现在存在的数肯定比该数后到,可以达到维护的效果
        if(LQ == RQ)
            return;
        if(MQue[L] == Que[LQ])  L++;
        LQ++;
    }
    
    int main()
    {
        //freopen("input.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        int T;
        scanf("%d", &T);
        while(T--)
        {
            L = R = 0;
            LQ = RQ = 0;
            char s[6], op;
            scanf("%s", s);
            
            while(scanf("%s", s))
            {
                if(s[0] == 'E')
                    break;
                if(s[0] == 'Q')
                {
                    //查询
                    printf("%d
    ", query() );
                }
                else if(s[0] == 'G')
                {
                    //出队
                    pop();
                }
                else
                {
                    int v;
                    scanf("%s%d", s, &v);
                    insert(v);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    装饰者模式
    代理模式
    享元模式
    模板模式
    命令模式
    建造者模式
    单例模式
    观察者模式
    迭代器模式
    访问者模式
  • 原文地址:https://www.cnblogs.com/dybala21/p/10765550.html
Copyright © 2011-2022 走看看