QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#685569 | #9528. New Energy Vehicle | PHarr | WA | 0ms | 3548kb | C++20 | 2.0kb | 2024-10-28 20:11:44 | 2024-10-28 20:11:44 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using i32 = int32_t;
using i64 = long long;
#define int i64
using vi = vector<int>;
using pii = pair<int,int>;
const int inf = LLONG_MAX / 2;
void solve() {
int n, m;
cin >> n >> m;
vi a(n + 1);
for(int i = 1; i <= n; i ++) cin >> a[i];
vi b = a;
vector<pii> charge(m);
for(auto &[x, t] : charge) cin >> x >> t;
vi lst(n + 1, inf), suf(m + 1);
for(int i = m - 1; i >= n; i --) {
auto [pos, ti] = charge[i];
suf[i] = lst[i], lst[ti] = i;
}
int now = 0;
priority_queue<pii, vector<pii>, greater<pii>> bank;
for(int i = 1; i <= n; i ++)
bank.emplace(lst[i], i);
for(int i = 0; i < m; i ++) {
auto[x, t] = charge[i];
while(now < x and not bank.empty()) {
auto [it, p] = bank.top();
bank.pop();
int y = min(x - now, b[p]);
now += y, b[p] -= y;
if(b[p] > 0 and p != t) bank.emplace(it, p);
}
if(now == x) {
b[t] = a[t];
bank.emplace(suf[i], t);
}else {
break;
}
}
for(auto i : b) {
now += i;
}
cout << now << "\n";
}
i32 main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<array<int,3>> c(n + 1);
for(int i = 1; i <= n; i ++) {
int w, l, r;
cin >> w >> l >> r;
c[i] = {w, l, r - l};
}
ranges::sort(c);
int sum = 0, used = 0;
for(int i = 1; i <= n; i ++) {
auto [wi, li, ri] = c[i];
sum += li * wi, used += li;
}
vi suf(n + 2), suf_used(n + 2);
for(int i = n; i >= 1; i --) {
suf[i] = suf[i + 1] + c[i][0] * c[i][2];
suf_used[i] = suf_used[i + 1] + c[i][2];
}
int res = 0;
for(int i = 1; i <= n; i ++) {
int now_sum = sum - c[i][1] * c[i][0];
int now_can = m - (used - c[i][1]);
int l = i + 1, r = n + 1, it = -1;
while(l <= r) {
int mid = (l + r) / 2;
if(suf_used[mid] <= now_can) it = mid, r = mid - 1;
else l = mid + 1;
}
now_sum += suf[it];
now_can -= suf_used[it];
it --;
now_sum += now_can * c[it][0];
res = max(res, now_sum);
}
cout << res;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3548kb
input:
2 3 1 3 3 3 8 1 2 2 5 2 1 2 2 1
output:
5
result:
wrong answer 1st lines differ - expected: '12', found: '5'