Submission #157526

#TimeUsernameProblemLanguageResultExecution timeMemory
157526atoizTwo Dishes (JOI19_dishes)C++14
100 / 100
6743 ms191160 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <cstdlib> #include <cmath> #include <climits> #include <cassert> #include <numeric> #include <tuple> #include <bitset> #include <unordered_map> #include <unordered_set> #include <map> #include <set> #include <queue> #include <ios> #include <iomanip> #include <random> #include <chrono> using namespace std; using ll = long long; #define FOR(i, a, b) for (int i = a; i <= b; ++i) #define FORA(i, a) for (auto &i : a) #define FORB(i, a, b) for (int i = a; i >= b; --i) #define SZ(a) ((int) a.size()); #define ALL(a) begin(a), end(a) const int MAXN = 1000007; const ll INF = 1e16; int N, M; ll A[MAXN], B[MAXN], S[MAXN], T[MAXN], P[MAXN], Q[MAXN]; vector<int> ids[MAXN]; // // ll lazy[MAXN << 2], tree[MAXN << 2]; // // void push(int root, int lo, int hi) // { // if (lo < hi) { // tree[root << 1] = max(tree[root], tree[root << 1] + lazy[root]); // tree[root << 1 | 1] = max(tree[root], tree[root << 1 | 1] + lazy[root]); // lazy[root << 1] += lazy[root]; // lazy[root << 1 | 1] += lazy[root]; // } else tree[root] = -INF; // lazy[root] = 0; // } // // void add(int l, int r, ll x, int root = 1, int lo = 0, int hi = M) // { // // FOR(i, l, r) tree[i] += x; // // return; // if (r < lo || hi < l) return; // push(root, lo, hi); // if (l <= lo && hi <= r) { // lazy[root] += x; // tree[root] += x; // return; // } // // int mid = (lo + hi) >> 1; // add(l, r, x, root << 1, lo, mid); // add(l, r, x, root << 1 | 1, mid + 1, hi); // } // // void upd(int l, int r, ll x, int root = 1, int lo = 0, int hi = M) // { // // FOR(i, l, r) tree[i] = max(tree[i], x); // // return; // if (r < lo || hi < l) return; // push(root, lo, hi); // if (l <= lo && hi <= r) { // tree[root] = max(tree[root], x); // return; // } // // int mid = (lo + hi) >> 1; // upd(l, r, x, root << 1, lo, mid); // upd(l, r, x, root << 1 | 1, mid + 1, hi); // } // // ll get(int id, int root = 1, int lo = 0, int hi = M) // { // // return tree[id]; // push(root, lo, hi); // if (lo == hi) return tree[root]; // // int mid = (lo + hi) >> 1; // if (id <= mid) return max(tree[root], get(id, root << 1, lo, mid)); // return max(tree[root], get(id, root << 1 | 1, mid + 1, hi)); // } ll cur_max[MAXN << 2], lazy[MAXN << 2], tree[MAXN << 2]; void push(int root, int lo, int hi) { if (lo < hi) { tree[root << 1] = max(tree[root << 1] + lazy[root], tree[root]); tree[root << 1 | 1] = max(tree[root << 1 | 1] + lazy[root], tree[root]); cur_max[root << 1] = max(cur_max[root << 1] + lazy[root], tree[root << 1]); cur_max[root << 1 | 1] = max(cur_max[root << 1 | 1] + lazy[root], tree[root << 1 | 1]); lazy[root << 1] += lazy[root]; lazy[root << 1 | 1] += lazy[root]; } tree[root] = -INF; lazy[root] = 0; } void add(int l, int r, ll x, int root = 1, int lo = 0, int hi = M) { // if (root == 1) cerr << "Add " << l << ' ' << r << ' ' << x << endl; if (r < lo || hi < l) return; push(root, lo, hi); if (l <= lo && hi <= r) { cur_max[root] += x; lazy[root] += x; tree[root] += x; return; } int mid = (lo + hi) >> 1; add(l, r, x, root << 1, lo, mid); add(l, r, x, root << 1 | 1, mid + 1, hi); cur_max[root] = max(tree[root], max(cur_max[root << 1], cur_max[root << 1 | 1])); } void upd(int l, int r, ll x, int root = 1, int lo = 0, int hi = M) { // if (root == 1) cerr << "Upd " << l << ' ' << r << ' ' << x << endl; if (r < lo || hi < l) return; push(root, lo, hi); if (l <= lo && hi <= r) { tree[root] = max(tree[root], x); cur_max[root] = max(cur_max[root], x); return; } int mid = (lo + hi) >> 1; upd(l, r, x, root << 1, lo, mid); upd(l, r, x, root << 1 | 1, mid + 1, hi); cur_max[root] = max(tree[root], max(cur_max[root << 1], cur_max[root << 1 | 1])); } ll get(int l, int r, int root = 1, int lo = 0, int hi = M) { ll ans = -INF; if (r < lo || hi < l) return ans; push(root, lo, hi); if (l <= lo && hi <= r) return cur_max[root]; int mid = (lo + hi) >> 1; ans = max(ans, get(l, r, root << 1, lo, mid)); ans = max(ans, get(l, r, root << 1 | 1, mid + 1, hi)); // if (root == 1) cerr << "Get " << l << ' ' << r << ": " << ans << endl; return ans; } ll read() { ll ans = 0; bool pos = 1; register char ch = getchar(); for (; ch == ' ' || ch == '\n'; ch = getchar()); if (ch == '-') pos = 0, ch = getchar(); for (; 47 < ch && ch < 58; ch = getchar()) ans = ans * 10 + ch - 48; return (pos ? ans : -ans); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); N = read(), M = read(); FOR(i, 1, N) A[i] = A[i - 1] + read(), S[i] = read(), P[i] = read(); A[N + 1] = INF; FOR(i, 1, M) B[i] = B[i - 1] + read(), T[i] = read(), Q[i] = read(); B[M + 1] = INF; FOR(j, 1, M) ids[upper_bound(A, A + N + 1, T[j] - B[j]) - A].push_back(j); FOR(i, 1, N + 1) { int j = upper_bound(B, B + M + 1, S[i] - A[i]) - B - 1; if (j >= 0) add(0, j, P[i]); vector<int> &vec = ids[i]; FORA(id, vec) add(id, M, Q[id]); if (i <= N) { if (0 <= j && j < M) vec.insert(lower_bound(vec.begin(), vec.end(), j + 1), j + 1); FORA(id, vec) upd(id, M, get(id - 1, id - 1)); } // FOR(id, 1, M) tree[id] = max(tree[id], tree[id - 1]); // FOR(j, 0, M) { // cerr << i << ' ' << j << ": " << get(j, j) << endl; // } } cout << get(M, M) << endl; }

Compilation message (stderr)

dishes.cpp: In function 'int main()':
dishes.cpp:28:26: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     #define FOR(i, a, b) for (int i = a; i <= b; ++i)
                          ^
dishes.cpp:174:9: note: in expansion of macro 'FOR'
         FOR(i, 1, N) A[i] = A[i - 1] + read(), S[i] = read(), P[i] = read(); A[N + 1] = INF;
         ^~~
dishes.cpp:174:78: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
         FOR(i, 1, N) A[i] = A[i - 1] + read(), S[i] = read(), P[i] = read(); A[N + 1] = INF;
                                                                              ^
dishes.cpp:28:26: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     #define FOR(i, a, b) for (int i = a; i <= b; ++i)
                          ^
dishes.cpp:175:9: note: in expansion of macro 'FOR'
         FOR(i, 1, M) B[i] = B[i - 1] + read(), T[i] = read(), Q[i] = read(); B[M + 1] = INF;
         ^~~
dishes.cpp:175:78: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
         FOR(i, 1, M) B[i] = B[i - 1] + read(), T[i] = read(), Q[i] = read(); B[M + 1] = INF;
                                                                              ^
#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...