zoukankan      html  css  js  c++  java
  • LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)

      被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的....

      显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T

    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    #define uint unsigned int
    using namespace std;
    const int maxn=20000010, inf=1e9;
    int n, m, a, b, d, T, l, r, L, R, up, fir, firans;
    int p[maxn], h[maxn], q[maxn];
    uint ans_sum, cur_ans;    
    bool fly[maxn], car[maxn];
    namespace IO{
        int c;
        unsigned int seed;
        unsigned int randnum(){
            seed^=seed<<13;
            seed^=seed>>17;
            seed^=seed<<5;
            return seed;
        }
    
        inline int read(int &x){scanf("%d",&x);return x;}
        inline void init_case(int &m,int &a,int &b,int &d,int p[]){
            scanf("%d%u%d%d%d%d",&m,&seed,&a,&b,&c,&d);
            for(int i=1;i<=m;i++){
                if(randnum()%c==0) p[i]=-1;
                else p[i]=randnum()%b;
            }
        }
    
        inline void update_ans(unsigned int &ans_sum,unsigned int cur_ans,int no){
            const static unsigned int mod=998244353;
            ans_sum^=(long long)no*(no+7)%mod*cur_ans%mod;
        }
    }
    using IO::read;
    using IO::init_case;
    using IO::update_ans;
    inline void qpush(int x)
    {
        while(L<=R && q[R]>=x) R--;
        q[++R]=x;
    }
    inline int min(int a, int b){return a<b?a:b;}
    int main()
    {
        read(T);
        while(T--)
        {
            init_case(m, a, b, d, p);
            up=max(a+1, b);
            memset(fly, 0, (up+1));
            memset(car, 0, (up+1));
            L=1; R=0; l=1; r=0; ans_sum=0; firans=a+1;
            for(int i=0;i<=a;i++) car[i]=1;
            for(int i=1;i<=m;i++)
            {
                cur_ans=0;
                if(p[i]==-1) 
                {
                    if(l<=r && !d) 
                    {
                        if(L<=R && q[L]==h[l]) L++;
                        fly[h[l++]]=0, cur_ans=(L<=R)?min(firans, q[L]):firans;
                    }
                }
                else
                {
                    if(!car[p[i]])
                    {
                        car[p[i]]=1;
                        while(car[firans]) firans++;
                        cur_ans=(L<=R)?min(firans, q[L]):firans;
                    }
                    else if(car[p[i]] && !fly[p[i]] && !d) fly[p[i]]=1, h[++r]=p[i], qpush(p[i]), cur_ans=(L<=R)?min(firans, q[L]):firans;
                    else if(l<=r && !d)
                    {
                        if(L<=R && q[L]==h[l]) L++;
                        fly[h[l++]]=0, cur_ans=(L<=R)?min(firans, q[L]):firans;
                    }
                }    
                update_ans(ans_sum, cur_ans, i);
            }
            printf("%u
    ", ans_sum);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    学习《MYSQL》课程,日期2017.4.25-2017.4.30
    Netty学习笔记
    WebSocket学习
    Class 泛型
    SAX解析与DOM解析
    HashMap和HashTable的区别
    SQL语句整理
    观察者模式学习
    状态模式学习
    策略模式学习
  • 原文地址:https://www.cnblogs.com/Sakits/p/7791475.html
Copyright © 2011-2022 走看看