NOIP 模拟 $21\; \rm Game$
阅读原文时间:2023年07月08日阅读:1

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

正解:

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

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

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

因为这个最大值是单调不增的,所以时间复杂度一次是 \(\mathcal O\rm (n)\) 总的就是 \(\mathcal O\rm (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\n",ans1-ans2);
        }
        return 0;
    }
}
int main() {return nanfeng::main();}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器