社区讨论
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 条回复,欢迎继续交流。
正在加载回复...