小糖人不会调精度求掉
查看原帖
小糖人不会调精度求掉
547238
篮网总冠军楼主2025/7/31 22:17
#include <bits/stdc++.h>
using namespace std;

int q[1000005],h,t;
long long x[1000005],p[1000005],c[1000005];
long long sp[1000005],ss[1000005],dp[1000005];
double xie(int x,int y){
	return (dp[x]-dp[y]+ss[x]-ss[y])*1.0/(sp[x]-sp[y]);
}
int main(){
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&x[i],&p[i],&c[i]);
	for(int i=1;i<=n;i++) sp[i]=sp[i-1]+p[i];
	for(int i=1;i<=n;i++) ss[i]=ss[i-1]+p[i]*x[i];
	h=t=1;
	for(int i=1;i<=n;i++){
		while(h<t&&xie(q[h],q[h+1])-x[i]<-0.0000000001) h++;
		dp[i]=dp[q[h]]+x[i]*(sp[i]-sp[q[h]])-(ss[i]-ss[q[h]])+c[i];
		if (p[i]==0) dp[i]=min(dp[i],dp[i-1]);	
		while(h<t&&xie(q[t-1],q[t])>=xie(q[t],i)) t--;
		q[++t]=i;
	}
	cout<<dp[n]<<endl;
	return 0;
}
2025/7/31 22:17
加载中...