95pts求调
查看原帖
95pts求调
110009
Soul_Love楼主2024/1/25 08:41

Wa #13

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
ll n,h,t,q[1001000],a;
db sum1[1001000],dp[1001000],sum2[1001000];
inline db X(ll i){return sum2[i];}
inline db Y(ll i){return dp[i];}
inline db slope(ll i,ll j){return (Y(i)-Y(j))/(X(i)-X(j));}
inline ll read()
{
	ll k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
inline ll f(ll l,ll r,ll k)
{
	ll ans=r;
	while(l<=r)
	{
		ll m=(l+r)>>1;
		if(slope(q[m],q[m+1])>k)
		{
			r=m-1;
			ans=m;
		}
		else l=m+1;
	}
	return ans;
}
int main()
{
	n=read(),a=read();
	for(int i=1;i<=n;i++)
	{
		scanf("%lf %lf",&sum1[i],&sum2[i]);
		sum1[i]+=sum1[i-1];
		sum2[i]+=sum2[i-1];
	}
	h=t=1;
	for(int i=1;i<=n;i++)
	{
		ll p=f(h,t,a+sum1[i]);
		dp[i]=dp[q[p]]+a*(sum2[n]-sum2[q[p]])+sum1[i]*(sum2[i]-sum2[q[p]]);
		while(h<t&&(Y(q[t]) - Y(q[t - 1])) * (X(i) - X(q[t])) >= (Y(i) - Y(q[t])) * (X(q[t]) - X(q[t - 1]))/*slope(q[t-1],q[t])>=slope(q[t],i)*/) t--;
		q[++t]=i;
	}
	printf("%lld",(ll)dp[n]);
	return 0;
}
2024/1/25 08:41
加载中...