QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#109556 | #71. Cake 3 | bashkort# | 0 | 0ms | 0kb | C++20 | 1.5kb | 2023-05-29 18:19:13 | 2024-05-31 13:47:24 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<ll> V(n), C(n), V_(n), C_(n);
for (int i = 0; i < n; ++i) {
cin >> V[i] >> C[i];
C[i] *= 2;
}
vector<int> ord(n);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin(), ord.end(), [&](int i, int j) {
return C[i] < C[j];
});
V_ = V, C_ = C;
for (int i = 0; i < n; ++i) {
C[i] = C_[ord[i]];
V[i] = V_[ord[i]];
}
using db = long double;
auto solve = [&](db penalty) { // siuuuuu
pair<db, int> ans{-3e18, -1};
pair<db, int> dp{-3e18, -1};
for (int i = 0; i < n; ++i) {
pair<db, int> now = {dp.first + V[i] - C[i] - penalty, dp.second - 1};
ans = max(ans, now);
now = {dp.first + V[i] - penalty, dp.second - 1};
dp = max({dp, pair{V[i] + C[i] - penalty, -1}, now});
}
return pair{ans.first, -ans.second};
};
ll lo = -3e12, hi = 3e12;
assert(solve(lo).second >= k && solve(hi).second <= k);
while (lo + 0.5 < hi) {
ll mid = (lo + hi) / 2;
auto [dp, mink] = solve(mid);
if (mink <= k) {
hi = mid;
} else {
lo = mid;
}
}
auto [dp, mink] = solve(hi);
cout << dp + k * hi << '\n';
return 0;
}
详细
Subtask #1:
score: 0
Time Limit Exceeded
Test #1:
score: 0
Time Limit Exceeded
input:
100 32 671208774 266481733 115497791 342597239 326245300 76223942 528973483 754205900 437996819 995535247 100582194 42402057 771100621 351934207 89058009 81951602 768935397 186435060 842907845 376386254 187943947 59424920 997369107 493642356 455078419 68850493 542835555 938351581 970171972 611243076...
output:
result:
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%