社区讨论

95pts求调,枯了

P5785[SDOI2012] 任务安排参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2bnuvt
此快照首次捕获于
2023/10/23 11:12
2 年前
此快照最后确认于
2023/11/03 11:21
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e5 + 5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n;
LL s;
LL dp[N], sumt[N], sumc[N];
int q[N], hh, tt;
/*
dp_i = dp_j + sumt_i * (sumc_i - sumc_j) + s * (sumc_n - sumc_j)
dp_i = dp_j + sumt_i * sumc_i - sumt_i * sumc_j + s * sumc_n - s * sumc_j
dp_j = (sumt_i + s) * sumc_j + dp_i - sumt_i * sumc_i - s * sumc_n
y = dp_j, k = sumt_i + s, x = sumc_j, b = dp_i - sumt_i * sumc_i - s * sumc_n
*/
LL X(int i) {return sumc[i];}
LL Y(int i) {return dp[i];}
double slope(int i, int j){return (double)(Y(i) - Y(j)) / (double)((X(i) - X(j) == 0 ? 1e-9 : X(i) - X(j)));}
int find(LL k)
{
	int l = hh, r = tt, res = tt;
	while(l <= r)
	{
		int mid = l + r >> 1;
		if(slope(q[mid], q[mid + 1]) > k) r = mid - 1, res = mid;
		else l = mid + 1;	
	}	
	return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
	cin >> n >> s;
	for(int i = 1; i <= n; i ++) 
		cin >> sumt[i] >> sumc[i], sumt[i] += sumt[i - 1], sumc[i] += sumc[i - 1];
	hh = 1, tt = 0;
	for(int i = 1; i <= n; i ++)
	{
		while(hh < tt && slope(q[tt], q[tt - 1]) >= slope(q[tt - 1], i - 1)) tt --;
		q[++ tt] = i - 1;
		int j = q[find(sumt[i] + s)];
		dp[i] = dp[j] + sumt[i] * (sumc[i] - sumc[j]) + s * (sumc[n] - sumc[j]);
	}
	cout << dp[n] << '\n';
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...