【MX-S1】梦熊周赛 · 提高组 1(同步赛)

【MX-S1】梦熊周赛 · 提高组 1(同步赛)

\(T1\) luogu P10672 【MX-S1-T1】壁垒 \(100pts\)

  • 一个简单的结论:随着前缀长度的增长,出现的数字种类数每次只能增加 \(0\)\(2\)。考虑构造时可以从这里下手。

  • 一种构造方案是这样的:优先让数字种类数增加 \(2\),即先将原先没有出现过的数往前放;接着让数字种类数增加 \(0\),即后将原先出现过的数往后放。

    • 同时,也解释了当 \(1 \sim n\) 中出现的数字种类数是奇数时不存在这样的重排方式。
  • 找重复元素时可以借助 unique 函数,但需要注意的是unique 函数对于重复的元素并不是将其删除,而是将其移动赋值,可能会覆盖先前的数,可参考 C++ 手册,故可以使用一个桶来进行手动统计。

    点击查看代码
    int a[100010],vis[100010];
    int main()
    {
        int n,m,i,j;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            vis[a[i]]++;
        }
        sort(a+1,a+1+n);
        m=unique(a+1,a+1+n)-(a+1);
        if(m%2==0)
        {
            for(i=1;i<=m;i++)
            {
                vis[a[i]]--;
                cout<<a[i]<<" ";
            }
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=vis[i];j++)
                {
                    cout<<i<<" ";
                }
            }
        }
        else
        {
            cout<<"-1"<<endl;
        }
        return 0;
    }
    

\(T2\) luogu P10673 【MX-S1-T2】催化剂 \(100pts\)

  • 从贪心的角度分析,当小 K 有 \(x(x \ge k)\) 个同种糖果时,将其分给 \(k\) 个小朋友时尽可能平均发是最优情况,此时产生的愤怒值为 \(x-k\)

  • 那么,设出现次数 \(\ge k\) 的糖果分别为 \(b_{1},b_{2},b_{3}, \dots ,b_{m}\),其出现次数分别为 \(c_{1},c_{2},c_{3}, \dots ,c_{m}\),最终有 \(\sum\limits_{i=1}^{m}c_{i}-mk\) 即为所求。其中,\(\sum\limits_{i=1}^{m}c_{i}\)\(m\) 均可通过权值树状数组维护。

  • 注意及时删除因修改造成的影响及树状数组中下标为 \(0\) 对操作中的影响。

    点击查看代码
    ll c[2][3000010],vis[3000010];
    ll lowbit(ll x)
    {
        return x&(-x);
    }
    void add(ll n,ll x,ll key,ll c[])
    {
        for(ll i=x;i<=n;i+=lowbit(i))
        {
            c[i]+=key;
        }
    }
    ll getsum(ll x,ll c[])
    {
        ll ans=0;
        for(ll i=x;i>=1;i-=lowbit(i))
        {
            ans+=c[i];
        }
        return ans;
    }
    int main()
    {
        ll n,q,pd,x,i;
        scanf("%lld%lld",&n,&q);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&x);
            if(vis[x]!=0)
            {
                add(3000000,vis[x],-1,c[0]);
                add(3000000,vis[x],-vis[x],c[1]);
            }
            vis[x]++;
            if(vis[x]!=0)
            {
                add(3000000,vis[x],1,c[0]);
                add(3000000,vis[x],vis[x],c[1]);
            }
        }
        for(i=1;i<=q;i++)
        {
            scanf("%lld%lld",&pd,&x);
            if(pd==1)
            {
                if(vis[x]!=0)
                {
                    add(3000000,vis[x],-1,c[0]);
                    add(3000000,vis[x],-vis[x],c[1]);
                }
                vis[x]++;
                if(vis[x]!=0)
                {
                    add(3000000,vis[x],1,c[0]);
                    add(3000000,vis[x],vis[x],c[1]);
                }
            }
            if(pd==2)
            {
                if(vis[x]!=0)
                {
                    add(3000000,vis[x],-1,c[0]);
                    add(3000000,vis[x],-vis[x],c[1]);
                }
                vis[x]--;
                if(vis[x]!=0)
                {
                    add(3000000,vis[x],1,c[0]);
                    add(3000000,vis[x],vis[x],c[1]);
                }
            }
            if(pd==3)
            {
                printf("%lld\n",getsum(3000000,c[1])-getsum(x-1,c[1])-(getsum(3000000,c[0])-getsum(x-1,c[0]))*x);
            }
        }
        return 0;
    }
    

\(T3\) luogu P10674 【MX-S1-T3】电动力学

  • 不会,暂时咕了。

\(T4\) luogu P10675 【MX-S1-T4】先见之明

  • 不会,暂时咕了。

总结

  • \(T1\)
    • 慎用 STL 。
  • \(T2\)
    • 注意动态插入需要的空间,同平衡树相关应用。
    • 注意大量输入、输出对时间损耗的影响。
posted @ 2024-06-29 20:16  hzoi_Shadow  阅读(124)  评论(0编辑  收藏  举报
扩大
缩小