社区讨论
100分 Unaccepted 心态崩了
P2120[ZJOI2007] 仓库建设参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo8ei66r
- 此快照首次捕获于
- 2023/10/27 17:18 2 年前
- 此快照最后确认于
- 2023/10/27 17:18 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll dp[N],sum[N],sump[N],h,t,q[N];
ll x[N],c[N],p[N],n;
//状态: dp[i]表示在第i个位置建仓库的最小花费
//状态转移方程: dp[i]=dp[j]+x[i]*(sump[i]-sump[j])-(sum[i]-sum[j])+c[i];
//sump[i]=∑j=1,i,p[i]
//sum[i]=∑j=1,i,x[i]*p[i]
//斜率k:(sum[j1]+dp[j1])-(sum[j2]+dp[j2])/sump[j1]-sump[j2]
ll X(ll j){
return sump[j];
}
ll Y(ll j){
return sum[j]+dp[j];
}
long double slope(ll i,ll j){
return (long double)(Y(j)-Y(i))/(X(j)-X(i));
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>p[i]>>c[i];
sump[i]=sump[i-1]+p[i];
sum[i]=sum[i-1]+x[i]*p[i];
}
for(int i=1;i<=n;i++){
while(h<t && slope(q[h],q[h+1])<=x[i]) h++;
int j=q[h];
dp[i]=dp[j]+x[i]*(sump[i]-sump[j])-sum[i]+sum[j]+c[i];
while(h<t && slope(q[t-1],q[t])>=slope(q[t-1],i)) t--;
q[++t]=i;
}
cout<<dp[n]<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...