被hack力,求调(悲
查看原帖
被hack力,求调(悲
758820
Porridge_Dust楼主2024/2/26 09:41
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e6 + 100;

typedef long long ll;

int n;
ll x[N], p[N], c[N], s[N];
int q[N], l, r;
ll f[N];

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i ++ ) {
		cin >> x[i] >> p[i] >> c[i];
	}
	for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + p[i] * x[i], p[i] += p[i - 1];
	
	for (int i = 1; i <= n; i ++ ) {
		while (l < r && f[q[l+1]]+s[q[l+1]] - f[q[l]]-s[q[l]] <= x[i] * (p[q[l+1]] - p[q[l]])) l ++ ;
		f[i] = f[q[l]] + c[i] - (s[i] - s[q[l]]) + x[i] * (p[i] - p[q[l]]);
		while (l < r && (double)(f[i]+s[i] - f[q[r]]-s[q[r]]) * (p[q[r]] - p[q[r-1]]) <= (double)(f[q[r]]+s[q[r]] - f[q[r-1]]-s[q[r-1]]) * (p[i] - p[q[r]])) r --;
		q[ ++ r] = i;
	}
	long long ans = 0x3f3f3f3f3f3f3f3f;
	for (int i = n; i >= 1; i -- ) {
		ans = min (ans, f[n]);
		if (p[i]) break;
	}
	cout << ans <<endl;
	return 0;
}
2024/2/26 09:41
加载中...