100 unaccepted求调
查看原帖
100 unaccepted求调
542567
CyberPrisoner楼主2023/6/23 17:27
#include<bits/stdc++.h>
#define ll long long
#define y(A) (f[A]+sum[A+1])
using namespace std;
const int N=1e6+10;
ll n,sum[N],sp[N],f[N],x[N],p[N],c[N];
int pos;
int que[N],head,tail;
bool flag;
inline double k(int a,int b){
	if(sp[a+1]==sp[b+1])return 1e18;
	return 1.0*(y(a)-y(b))/(sp[a+1]-sp[b+1]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>p[i]>>c[i];
	}
	ll len=x[n];
	for(int i=n;i>=1;i--){
		x[i]=len-x[i];
		sum[i]=sum[i+1]+x[i]*p[i];
		sp[i]=sp[i+1]+p[i];
	}
	for(int i=1;i<=n;i++){
		while(head<tail&&k(que[head+1],que[head])>=1.0*x[i]){
			head++;
		}
		int j=que[head];
		f[i]=f[j]+sum[j+1]-sum[i+1]-x[i]*(sp[j+1]-sp[i+1])+c[i];		
		while(head<tail&&k(i,que[tail])>=k(que[tail],que[tail-1])){
			tail--;
		}
		que[++tail]=i;
	}
	pos=n;
	while(pos&&!p[pos])pos--; 
	if(!pos){
		cout<<0;return 0;
	}
	ll ans=1e18;
	for(int i=pos;i<=n;i++){
		ans=min(ans,f[i]);
	}
	cout<<ans;
}
2023/6/23 17:27
加载中...