斜率优化被HACK求条
查看原帖
斜率优化被HACK求条
1164775
Jadonyzx楼主2024/7/25 08:15
#include<bits/stdc++.h>
#define maxn 1000010
#define int unsigned long long
#define double long double
using namespace std;
int n,cnt[maxn],x[maxn],pre[maxn],dp[maxn],head,tail,q[maxn],p[maxn],c[maxn];
bool ap;
inline double X(int id){return (double)cnt[id];}
inline double Y(int id){return (double)(dp[id]-pre[id]+cnt[id]*x[id]);}
inline double k(int i,int j){return (double)((Y(i)-Y(j))/(X(i)-X(j)));}
signed main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>x[i]>>p[i]>>c[i];
		if(p[i]==0){i--;n--;}
		cnt[i]=cnt[i-1]+p[i];
		pre[i]=pre[i-1]+cnt[i-1]*(x[i]-x[i-1]);
	}
	if(n==0){cout<<0;return 0;}
	memset(dp,0x7fffffffffffffff,sizeof dp);
	head=tail=0;q[head]=dp[0]=0;
	for(int i=1;i<=n;++i){
		while(head<tail&&(Y(q[head+1])-Y(q[head]))<=x[i]*(X(q[head+1])-X(q[head])))head++;
		int j=q[head];dp[i]=dp[j]+c[i]+pre[i]-pre[j]-cnt[j]*(x[i]-x[j]);
		while(head<tail&&(Y(q[tail])-Y(q[tail-1]))*(X(i)-X(q[tail]))>=(Y(q[tail])-Y(i))*(X(q[tail-1])-X(q[tail])))tail--;
		q[++tail]=i;
	}
	
	if(p[n]==0){
		int ans=0x7fffffffffffffff;
		for(int j=n;j>=1;j--){
			if(p[j])break;
			else ans=min(ans,dp[j]);
		}
		cout<<ans;
	}
	else cout<<dp[n];
	return 0;
}
2024/7/25 08:15
加载中...