zoukankan      html  css  js  c++  java
  • NOIP 模拟 $21; m Game$

    题解

    考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了。

    正解:

    值域很小,所以我们开个桶,维护当前最大值。

    如果新加入的值大于最大值,那么它肯定直接被下一个人选走。

    如果不大于这个最大值,那么直接选择最大值,同时对最大值的桶减一,如果最大值的桶为零,那么往下跳值域直到一个桶不为零的。

    因为这个最大值是单调不增的,所以时间复杂度一次是 (mathcal O m (n)) 总的就是 (mathcal O m (nk))

    代码很好打,知道思路后五分钟就能打出来

    #include<bits/stdc++.h>
    #define ri register signed
    #define p(i) ++i
    using namespace std;
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf;
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
        template<typename T>inline void read(T &x) {
            ri f=1;x=0;register char ch=gc();
            while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
            while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
            x=f?x:-x;
        }
    }
    using IO::read;
    namespace nanfeng{
        #define FI FILE *IN
        #define FO FILE *OUT
        template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
        template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
        typedef long long ll;
        static const int N=1e5+7;
        int nm[N],T[N],p,k,n,mx,fg=0,num;
        ll ans1,ans2;
        inline int main() {
            // FI=freopen("nanfeng.in","r",stdin);
            // FO=freopen("nanfeng.out","w",stdout);
            read(n),read(k);
            for (ri i(1);i<=n;p(i)) read(nm[i]);
            for (ri i(1);i<=k;p(i)) {
                read(p);
                ans1=ans2=0;
                num=mx=fg=0;
                for (ri i(1);i<=p;p(i)) p(T[nm[i]]),mx=cmax(mx,nm[i]);
                while(1) {
                    if (!fg) ans1+=mx;
                    else ans2+=mx;
                    fg^=1;
                    T[mx]-=1;
                    p(num);
                    while (!T[mx]) --mx;
                    p(p); 
                    while (p<=n&&nm[p]>mx) {
                        if (!fg) ans1+=nm[p];
                        else ans2+=nm[p];
                        p(num);
                        fg^=1;
                        p(p);
                    }
                    if (p<=n) T[nm[p]]+=1;
                    if (num==n) break;
                }
                printf("%lld
    ",ans1-ans2);
            }
            return 0;
        }  
    }
    int main() {return nanfeng::main();} 
    
  • 相关阅读:
    P1006 传纸条
    P1387 最大正方形
    P1417 烹调方案
    P1052 过河
    P1063 能量项链
    P1736 创意吃鱼法
    P1156 垃圾陷阱
    P1220 关路灯
    @P1373 小a和uim之大逃离
    【leetcode】Interleaving String
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15038614.html
Copyright © 2011-2022 走看看