Submission #944604

#TimeUsernameProblemLanguageResultExecution timeMemory
944604LOLOLOTwo Dishes (JOI19_dishes)C++17
74 / 100
5288 ms291968 KiB
#include <bits/stdc++.h> typedef long long ll; #define f first #define s second #define pb push_back #define ep emplace #define eb emplace_back #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define uniquev(v) sort(all(v)), (v).resize(unique(all(v)) - (v).begin()) #define mem(f,x) memset(f , x , sizeof(f)) #define sz(x) (int)(x).size() #define __lcm(a, b) (1ll * ((a) / __gcd((a), (b))) * (b)) #define mxx *max_element #define mnn *min_element #define cntbit(x) __builtin_popcountll(x) using namespace std; const int N = 1e6 + 10; ll A[N], B[N], SA[N], SB[N], S[N], T[N], Q[N], P[N]; vector <pair <ll, ll>> pos[N]; ll lim = -1e16; struct ST{ vector <ll> seg, laz, ass; ST(int n) { for (int i = 0; i <= n * 4 + 100; i++) { seg.pb(0); laz.pb(0); ass.pb(lim); } } void push(int id, int l, int r) { seg[id] = max(seg[id] + laz[id], ass[id]); if (l == r) { laz[id] = 0; ass[id] = lim; return; } ll t = laz[id]; ass[id * 2] = max(ass[id * 2] + t, ass[id]); ass[id * 2 + 1] = max(ass[id * 2 + 1] + t, ass[id]); laz[id * 2] += t; laz[id * 2 + 1] += t; laz[id] = 0; ass[id] = lim; } void upd(int id, int l, int r, int u, int v, ll t) { push(id, l, r); if (l > v || r < u) return; if (l >= u && r <= v) { laz[id] += t; ass[id] += t; push(id, l, r); return; } int m = (l + r) / 2; upd(id * 2, l, m, u, v, t); upd(id * 2 + 1, m + 1, r, u, v, t); seg[id] = max(seg[id * 2], seg[id * 2 + 1]); } void range(int id, int l, int r, int u, int v, ll val) { push(id, l, r); if (l > v || r < u) return; if (l >= u && r <= v) { ass[id] = val; push(id, l, r); return; } int m = (l + r) / 2; range(id * 2, l, m, u, v, val); range(id * 2 + 1, m + 1, r, u, v, val); seg[id] = max(seg[id * 2], seg[id * 2 + 1]); } ll get(int id, int l, int r, int u, int v) { push(id, l, r); if (u > v || l > v || r < u) return -1e12; if (l >= u && r <= v) return seg[id]; int m = (l + r) / 2; return max(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v)); } }; vector <pair <ll, ll>> compress(vector < pair <ll, ll>> &v) { vector <pair <ll, ll>> st; for (auto x : v) { if (st.empty() || st.back().f != x.f) { st.pb(x); } else { st[sz(st) - 1].s += x.s; } } return st; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll ans = 0; int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> A[i] >> S[i] >> P[i]; SA[i] = SA[i - 1] + A[i]; } for (int i = 1; i <= m; i++) { cin >> B[i] >> T[i] >> Q[i]; SB[i] = SB[i - 1] + B[i]; } for (int i = 1; i <= n; i++) { if (SA[i] > S[i]) continue; ans += P[i]; int id = upper_bound(SB, SB + 1 + m, S[i] - SA[i]) - SB - 1; pos[i - 1].pb({id + 1, -P[i]}); } for (int i = 1; i <= m; i++) { if (SB[i] > T[i]) continue; int id = upper_bound(SA, SA + 1 + n, T[i] - SB[i]) - SA - 1; pos[id].pb({i, Q[i]}); } for (int i = 1; i <= n; i++) { sort(all(pos[i])); pos[i] = compress(pos[i]); } ST seg(m); for (int i = 0; i <= n; i++) { for (auto x : pos[i]) { seg.upd(1, 0, m, x.f, m, x.s); } reverse(all(pos[i])); int lx = m; for (auto x : pos[i]) { seg.range(1, 0, m, x.f, lx, seg.get(1, 0, m, 0, x.f)); lx = x.f -1; } } cout << seg.get(1, 0, m, m, m) + ans << '\n'; 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...