不是妹子,码风优美,和标程几乎一样,求调
查看原帖
不是妹子,码风优美,和标程几乎一样,求调
251449
hfjh楼主2023/3/23 14:14

该加的都加了还是过不了subtask

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 10;
int n,res = 0;
ll x[N],p[N],c[N],qp[N],qpx[N],f[N];
int q[N],head = 1,tail = 1;
ll X(int i){
	return qp[i];
}
ll Y(int i){
	return f[i] + qpx[i];
}
long double slope(int i,int j){
	if(X(i)==X(j)) return 1e18;
	return ((Y(i) - Y(j) )* 1.0)/(X(i) - X(j)); 
}

void input(){
	scanf("%d",&n);
	for(int i = 1;i <= n; ++i){
		scanf("%lld%lld%lld",&x[i],&p[i],&c[i]);
		qp[i] = qp[i - 1] + p[i];
		qpx[i] = qpx[i - 1] + p[i] * x[i];
	}
}
void op(){
	for(int i = 1;i <= n; ++i){
		while(head < tail && slope(q[head],q[head + 1]) < x[i])++head;
		int j = q[head];
		f[i] = f[j] + x[i] * qp[i] - x[i] * qp[j] - qpx[i] + qpx[j] + c[i];
		while(head < tail && slope(i,q[tail]) < slope(q[tail],q[tail - 1]))--tail;
		q[++tail] = i;
	}
}
int main(){
	input();
	op();
	ll ans = 0x3f3f3f3f3f3f;
	for(int i = n;i >= 1; --i){
		ans = min(ans,f[i]);
		if(p[i]) break;
	}
	printf("%lld",ans);
	return 0;
}
2023/3/23 14:14
加载中...