CF1928D Lonely Mountain Dungeons 题解
这道题送我上紫名。
似乎大部分人的做法都是二分、三分。这里提供一个组合数学 + 差分的赛时做法。
首先观察到每个族群互相独立,又因为
对于一个有
最后统计答案的时候,如果枚举到的队伍数比前面某个族群的人数
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
int C2(int x){
return x*(x-1)>>1;
}
main(){
ios::sync_with_stdio(false);
int t; cin>>t;
while(t--){
int n,b,m=1,x; cin>>n>>b>>x;
vector<int> c(n);
for(auto &i:c)cin>>i,m=max(m,i);
vector<int> d(m+1);
auto upd=[&](int l,int r,int x){
d[l]+=x; if(r<m)d[r+1]-=x;
};
for(int i=0;i<n;i++){
vector<int> s(c[i]+1);
for(int j=1;j<=c[i];j++){
int y=c[i]/j,x1=c[i]%j,x2=j-x1;
s[j]=(y+1)*(y+1)*b*C2(x1)+y*y*b*C2(x2)+y*(y+1)*b*x1*x2;
upd(j,j,s[j]);
}
if(c[i]+1<=m)upd(c[i]+1,m,s[c[i]]);
}
int w=0;
for(int i=1;i<=m;i++)
w=max(w,(d[i]+=d[i-1])-(i-1)*x);
cout<<w<<'\n';
}
return 0;
}