rt,根本没考虑横坐标相等的情况,竟然 AC 了?(包括 hack)
求助原因/kk
代码:
#include<bits/stdc++.h>//I will AC!!!11
using namespace std;
const int N=1000100;
long double x[N],p[N],c[N];
long double s1[N],s2[N];
long double f[N];
int n;
int q[N],head,tail;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>p[i]>>c[i];
s1[i]=s1[i-1]+p[i];
s2[i]=s2[i-1]+x[i]*p[i];
}
head=tail=1;
q[1]=0;
for(int i=1;i<=n;i++){
while(head<tail){
if(x[i]>=(long double)(f[q[head+1]]+s2[q[head+1]]-f[q[head]]-s2[q[head]])/(long double)(s1[q[head+1]]-s1[q[head]]))
head++;
else
break;
}
int j=q[head];
f[i]=f[j]+x[i]*s1[i]-x[i]*s1[j]-s2[i]+s2[j]+c[i];
while(head<tail){
if((long double)(f[i]+s2[i]-f[q[tail]]-s2[q[tail]])/(long double)(s1[i]-s1[q[tail]])<=(long double)(f[q[tail]]+s2[q[tail]]-f[q[tail-1]]-s2[q[tail-1]])/(long double)(s1[q[tail]]-s1[q[tail-1]]))
tail--;
else
break;
}
tail++;
q[tail]=i;
}
long double minn=f[n];
for(int i=n;i>=1;i--){
minn=min(minn,f[i]);
if(p[i])
break;
}
long long qwq=minn;
cout<<qwq<<endl;
return 0;
}