社区讨论

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 条回复,欢迎继续交流。

正在加载回复...