CF1928D Lonely Mountain Dungeons

原题链接

F(n,m) 是将 n 个同种族的人放到 m 个队伍中可以获得的贡献。可以发现在同一个队伍中的人不能互相产生贡献,所以尽可能平均分配是最优的。

p=nm,q=nmodm,那么有 mq 个队伍中有 p 个人,q 个队伍中有 p+1 个人,贡献是

F(n,m)=n(n+1)2(mq)×p(p+1)2q×(p+1)(p+2)2

fj 是分成 j 个队伍可以获得的贡献,枚举每个种族 i,使 fjfj+F(ci,min(j,ci)),相当于单点加与后缀加,差分前缀和就行了。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=2e5+10;
int T,n,b,z,c[MAXN],f[MAXN],MAX,ans;
inline int F(int x,int y)
{
    int p=x/y,q=x%y;
    return x*(x+1)/2-(y-q)*p*(p+1)/2-q*(p+1)*(p+2)/2;
}
inline void work()
{
    cin>>n>>b>>z;
    for(int i=1;i<=n;++i)
    {
        cin>>c[i];MAX=max(MAX,c[i]);
        for(int j=1;j<c[i];++j)
        {
            int cur=F(c[i],j)*b;
            f[j]+=cur,f[j+1]-=cur;
        }
        f[c[i]]+=F(c[i],c[i])*b;
    }
    for(int i=1;i<=MAX;++i)
        f[i]+=f[i-1],ans=max(ans,f[i]-(i-1)*z);
    for(int i=1;i<=MAX;++i) f[i]=0;
    cout<<ans<<'\n';MAX=ans=0;return ;
}
signed main()
{
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>T;while(T--) work();
    return 0;
}
posted @   int_R  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示