不考虑横坐标相等然后过了?
查看原帖
不考虑横坐标相等然后过了?
140360
MeowScore楼主2022/4/3 17:56

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;
}
2022/4/3 17:56
加载中...