Submission #709709

#TimeUsernameProblemLanguageResultExecution timeMemory
709709PixelCatTwo Dishes (JOI19_dishes)C++14
100 / 100
4280 ms258388 KiB
#include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define sz(x) ((int)x.size()) #define all(x) x.begin(), x.end() #define eb emplace_back #define int LL using namespace std; using LL = long long; using pii = pair<int, int>; const int MAXN = 1000010; const int INF = 8e18; // range add, range max #define L(id) ((id) * 2 + 1) #define R(id) ((id) * 2 + 2) struct SegTree { struct Node { int mx, add; } a[MAXN << 2]; void init(int val) { For(i, 0, (MAXN << 2) - 1) { a[i].mx = val; a[i].add = 0; } } void _add(int id, int x) { a[id].add += x; a[id].mx += x; } void pull(int id) { a[id].mx = max(a[L(id)].mx, a[R(id)].mx); } void push(int id) { if(a[id].add != 0) { _add(L(id), a[id].add); _add(R(id), a[id].add); a[id].add = 0; } } void add(int id, int l, int r, int L, int R, int x) { // if(l > R || r < L) return; if(l >= L && r <= R) { _add(id, x); return; } push(id); int m = (l + r) / 2; if(L <= m) add(L(id), l, m, L, R, x); if(R > m) add(R(id), m + 1, r, L, R, x); pull(id); } void set(int id, int l, int r, int i, int x) { if(l == r) { a[id].mx = max(a[id].mx, x); a[id].add = 0; return; } push(id); int m = (l + r) / 2; if(i <= m) set(L(id), l, m, i, x); else set(R(id), m + 1, r, i, x); pull(id); } int ask(int id, int l, int r, int L, int R) { if(l >= L && r <= R) return a[id].mx; push(id); int m = (l + r) / 2; int res = -INF; if(L <= m) res = max(res, ask(L(id), l, m, L, R)); if(R > m) res = max(res, ask(R(id), m + 1, r, L, R)); return res; } } seg, seg2, seg3; int a1[MAXN]; int s1[MAXN]; int p1[MAXN]; int pr1[MAXN]; int t1[MAXN]; int a2[MAXN]; int s2[MAXN]; int p2[MAXN]; int pr2[MAXN]; int t2[MAXN]; // int su[MAXN][MAXN]; int dp[MAXN]; int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // NYA =^-w-^= int n, m; // #define QWQ #ifndef QWQ cin >> n >> m; assert(n <= MAXN); For(i, 1, n) { cin >> a1[i] >> s1[i] >> p1[i]; pr1[i] = pr1[i - 1] + a1[i]; } For(i, 1, m) { cin >> a2[i] >> s2[i] >> p2[i]; pr2[i] = pr2[i - 1] + a2[i]; } #else mt19937 rng(48763); n = m = 5; For(i, 1, n) { a1[i] = rng() % 10 + 1; s1[i] = rng() % 100 + 1; p1[i] = 1; pr1[i] = pr1[i - 1] + a1[i]; } For(i, 1, m) { a2[i] = rng() % 10 + 1; s2[i] = rng() % 100 + 1; p2[i] = 1; pr2[i] = pr2[i - 1] + a2[i]; } #endif vector<pair<pii, int>> v; For(i, 1, n) { auto it = upper_bound(pr2, pr2 + m + 1, s1[i] - pr1[i]); t1[i] = it - pr2 - 1; if(t1[i] >= 0) v.eb(pii(t1[i], i), 1); } For(i, 1, m) { auto it = upper_bound(pr1, pr1 + n + 1, s2[i] - pr2[i]); t2[i] = it - pr1 - 1; if(p2[i] < 0 && t2[i] < n && t2[i] >= 0) v.eb(pii(i - 1, t2[i] + 1), 0); } v.eb(pii(m, n + 1), 0); sort(all(v)); reverse(all(v)); seg.init(-INF); seg2.init(0); for(auto &i:v) if(i.S) { seg2.add(0, 0, n + 1, i.F.S, n + 1, p1[i.F.S]); } seg.set(0, 0, n + 1, 0, 0); For(it, 0, m) { if(it && (t2[it] >= 0)) { seg.add(0, 0, n + 1, 0, t2[it], p2[it]); } int last = 0; while(sz(v) && v.back().F.F == it) { int i = v.back().F.S; int owo = v.back().S; // cout << v.back().F.F << " " << i << " " << owo << "\n" << flush; v.pop_back(); if(owo) { seg2.add(0, 0, n + 1, i, n + 1, -p1[i]); seg.add(0, 0, n + 1, i, n + 1, p1[i]); } int val = seg.ask(0, 0, n + 1, last, i - 1) + seg2.ask(0, 0, n + 1, i, i); if(owo) val += p1[i]; seg.set(0, 0, n + 1, i, val - seg2.ask(0, 0, n + 1, i, i)); last = i; } } cout << seg.ask(0, 0, n + 1, n + 1, n + 1) << "\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...