제출 #1173922

#제출 시각아이디문제언어결과실행 시간메모리
11739221binTwo Dishes (JOI19_dishes)C++20
0 / 100
486 ms57064 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(), v.end() typedef long long ll; const int b = 1<<20; const ll inf = 1e18; ll n, m, A[b], S[b], P[b], sumA[b], sumB[b]; ll B[b], T[b], Q[b]; vector<ll> va, vb; ll seg[b * 2], ADD[b * 2], MX[b * 2]; void upd_lazy(int ix, int l, int r) { if (ADD[ix]) { seg[ix] += ADD[ix]; if (l != r) { ADD[ix * 2] += ADD[ix]; ADD[ix * 2 + 1] += ADD[ix]; MX[ix * 2] += ADD[ix]; MX[ix * 2 + 1] += ADD[ix]; } ADD[ix] = 0; } if (MX[ix] > -inf) { seg[ix] = max(seg[ix], MX[ix]); if (l != r) { MX[ix * 2] = max(MX[ix * 2], MX[ix]); MX[ix * 2 + 1] = max(MX[ix * 2 + 1], MX[ix]); } MX[ix] = -inf; } } void upd(int ix, int nl, int nr, int l, int r, ll v, int f) { upd_lazy(ix, nl, nr); if (nl > r || nr < l) return; if (nl >= l && nr <= r) { if (!f) ADD[ix] += v; else MX[ix] = max(MX[ix], v); upd_lazy(ix, nl, nr); return; } int m = (nl + nr) / 2; upd(ix * 2, nl, m, l, r, v, f); upd(ix * 2 + 1, m + 1, nr, l, r, v, f); seg[ix] = max(seg[ix * 2], seg[ix * 2 + 1]); } ll qry(int ix, int nl, int nr, int l, int r) { upd_lazy(ix, nl, nr); if (nl > r || nr < l) return -inf; if (nl >= l && nr <= r) return seg[ix]; int m = (nl + nr) / 2; return max(qry(ix * 2, nl, m, l, r), qry(ix * 2 + 1, m + 1, nr, l, r)); } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); vector<tuple<ll, ll, ll>> Qry; ll sum = 0; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> A[i] >> S[i] >> P[i]; sumA[i] = sumA[i - 1] + A[i]; } for (int i = 1; i <= m; i++) { cin >> B[i] >> T[i] >> Q[i]; sumB[i] = sumB[i - 1] + B[i]; } for (int i = 1; i <= n; i++) { ll y = upper_bound(sumB, sumB + m + 1, S[i] - sumA[i]) - sumB - 1; if (y >= 0) Qry.emplace_back(i, -y, P[i]); } for (int i = 1; i <= m; i++) { ll x = upper_bound(sumA, sumA + n + 1, T[i] - sumB[i]) - sumA - 1; if (x >= 0) { sum += Q[i]; if (x < n) Qry.emplace_back(x + 1, -(i - 1), -Q[i]); } } sort(all(Qry)); // init memset(seg, 0xc1, sizeof(seg)); memset(MX, 0xc1, sizeof(MX)); for (int i = 1; i <= n; i++) seg[b + i] = 0; for (int i = b - 1; i; i--) seg[i] = max(seg[i * 2], seg[i * 2 + 1]); for (auto&[x, y, p] : Qry) { y = -y; // cout << x << ' ' << y << ' ' << p << endl; upd(1, 0, b - 1, 0, y, p, 0); // add ll mx = qry(1, 0, b - 1, y, y); upd(1, 0, b - 1, y + 1, m, mx, 1); // max } // cout << sum << ' '; cout << sum + qry(1, 0, b - 1, m, m); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...