题解:P8179 「EZEC-11」Tyres
Aegleseeker_ · · 题解
很有意思的题。
先考虑
再考虑
其中
现在我们考虑正解。由于
注意到当
#include<bits/stdc++.h>
using namespace std;
const int N=505;
const int M=2e5+5;
#define int long long
int n,m,t,B;
int a[N],b[N];
long long f[N][N*25],g[M],s[M],ans=4e18;
long long calc(int i,int j){
return a[i]*j+b[i]*s[j-1];
}
struct node{
int i,j;
long long val;
bool operator <(const node &b)const{
return val>b.val;
}
};
priority_queue<node> q;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
for(int i=1;i<M;i++){
s[i]=s[i-1]+i*i;
}
cin>>n>>m>>t;
B=ceil(sqrt(t));
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
for(int i=0;i<N;i++){
for(int j=0;j<N*25;j++){
f[i][j]=4e18;
}
}
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=min(m,B*i);j++){
for(int k=max(0ll,j-B);k<=j;k++){
f[i][j]=min(f[i][j],f[i-1][k]+(k!=j&&k!=0)*t+calc(i,j-k));
}
}
}
for(int i=1;i<=n;i++){
q.push(node{i,B+1,a[i]+1ll*b[i]*B*B});
}
for(int i=1;i<=m;i++){
node u=q.top();
q.pop();
g[i]=g[i-1]+u.val;
u.j++,u.val=a[u.i]+1ll*b[u.i]*(u.j-1)*(u.j-1);
q.push(u);
}
for(int i=0;i<=min(m,B*n);i++){
ans=min(ans,f[n][i]+g[m-i]);
}
cout<<ans;
return 0;
}