怎么连样例都过不去。。。
查看原帖
怎么连样例都过不去。。。
786957
YDHJ楼主2023/8/29 15:59

感觉自己推得式子和代码的实现都没看出问题
但是连样例都过不去
求dalao看一眼,有没有哪里写错了

#include<bits/stdc++.h>
#define int long long
#define maxn 100010
#define maxm 100010
#define inf 0x7fffffff
using namespace std;
int x[maxn],sum[maxn],p[maxn],t[maxn];
int c[maxn];
int dp[maxn];
int q[maxn<<2];
int n;
double X(int p){
	return sum[p]*1.0;
}
double Y(int p){
	return 1.0*dp[p]+1.0*t[p];
}
double calc(int u,int v){
	return X(u)!=X(v)?(double)1.0*(Y(v)-Y(u))/(double)1.0*(X(v)-X(u)):inf;
}
int ans=inf;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>p[i]>>c[i];
		sum[i]=sum[i-1]+p[i];
		t[i]=t[i-1]+p[i]*x[i];
	}
	int head=1,tail=1;
	for(int i=1;i<=n;i++)
	{
		while(head<tail&&calc(q[head],q[head+1])<=(double)1.0*x[i])
			head++;
		int j=q[head];
		dp[i]=dp[j]+c[i]+x[i]*(sum[i]-sum[j])-t[i]+t[j];
		while(head<tail&&calc(q[tail-1],q[tail])>=calc(q[tail],i))
			tail--;
		q[++tail]=i;
	}
	cout<<dp[n]<<"\n";
	return 0;
}
2023/8/29 15:59
加载中...