Submission #1160637

#TimeUsernameProblemLanguageResultExecution timeMemory
1160637fzyzzz_zTwo Dishes (JOI19_dishes)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = (1LL << 20); ll tree[2 * N]; const int ID = 0; void init() { for (int i = 0; i < 2 * N; ++i) { tree[i] = ID; } } ll query(int l, int r, int ind = 1, int L = 0, int R = N - 1) { if (l <= L && R <= r) { return tree[ind]; } if (l > R || L > r) { return ID; } int M = (L + R) / 2; return max(query(l, r, 2 * ind, L, M), query(l, r, 2 * ind + 1, M + 1, R)); } void update(int x, ll v, int ind = 1, int L = 0, int R = N - 1) { if (L > x || x > R) { return; } if (L == x && x == R) { tree[ind] = max(tree[ind], v); return; } int M = (L + R) / 2; update(x, v, 2 * ind, L, M); update(x, v, 2 * ind + 1, M + 1, R); tree[ind] = max(tree[2 * ind + 1], tree[2 * ind]); } array<ll, 3> a[N], b[N]; ll pa[N], pb[N]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); init(); int n, m; cin >> n >> m; // {time, req, score} for (int i = 0; i < n; ++i) { for (int j = 0; j < 3; ++j) { cin >> a[i][j]; } } for (int i = 0; i < m; ++i) { for (int j = 0; j < 3; ++j) { cin >> b[i][j]; } } for (int i = 0; i < n; ++i) { pa[i + 1] = pa[i] + a[i][0]; } for (int i = 0; i < m; ++i) { pb[i + 1] = pb[i] + b[i][0]; } ll ans = 0; // edges[i] : {time, dir, score} -1 means A[i]->B vector<vector<array<ll, 3>>> edges(n); for (int i = 0; i < n; ++i) { auto can_get = [&] (int x) -> bool { // can process x'th from B and still get award for A[i] return pb[x + 1] + pa[i + 1] <= a[i][1]; }; if (can_get(m - 1)) { ans += a[i][2]; continue; } if (!can_get(0)) { continue; } int lo = 0, hi = m - 1; while (lo < hi) { int md = (lo + hi + 1) / 2; if (can_get(md)) lo = md; else hi = md - 1; } if (a[i][2] > 0) { // do A[i] before B[lo + 1] edges[i].push_back({lo + 1, -1, a[i][2]}); } else { // do B[lo + 1] before A[i] ans += a[i][2]; edges[i].push_back({lo + 1, 1, -a[i][2]}); } } for (int i = 0; i < m; ++i) { auto can_get = [&] (int x) -> bool { return pa[x + 1] + pb[i + 1] <= b[i][1]; }; if (can_get(n - 1)) { ans += b[i][2]; continue; } if (!can_get(0)) { continue; } int lo = 0, hi = n - 1; while (lo < hi) { int md = (lo + hi + 1) / 2; if (can_get(md)) lo = md; else hi = md - 1; } if (b[i][2] > 0) { // do B[i] before A[lo + 1] edges[lo + 1].push_back({i, 1, b[i][2]}); } else { // do A[lo + 1] before B[i] ans += b[i][2]; edges[lo + 1].push_back({i, -1, -b[i][2]}); } } // segtree[x] after time t stores dp(first t from A, x from B), 1B for (int t = 0; t < n; ++t) { sort(edges[t].begin(), edges[t].end()); vector<pair<ll, ll>> to_upd; // cout << "!! " << t << '\n'; ll dp = 0, dp2 = 0; for (auto [at, dir, w]: edges[t]) { if (dir == -1) { // outwards dp2 = max(dp2, dp) + w; to_upd.push_back({at + 1, dp2}); } else { // inwards dp = max(dp, query(0, at + 1)) + w; to_upd.push_back({at + 1, dp}); } // cout << "? " << at << ' ' << dir << ' ' << w << '\n'; } for (auto [x, v]: to_upd) { update(x, v); // cout << "upd " << x << ' ' << v << '\n'; } } cout << (ans + query(0, m)) << '\n'; return 0; } ce

Compilation message (stderr)

dishes.cpp:163:1: error: 'ce' does not name a type
  163 | ce
      | ^~