Submission #170769

#TimeUsernameProblemLanguageResultExecution timeMemory
170769gs18103Two Dishes (JOI19_dishes)C++14
5 / 100
600 ms43412 KiB
#include <bits/stdc++.h> #define fi first #define se second #define eb emplace_back #define em emplace #define all(v) v.begin(), v.end() #define my_assert cout << "!" << endl; using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; const int MAX = 1010101; const int INF = (1 << 30) - 1; const ll LINF = 1LL << 60; int n, m; ll A[MAX], S[MAX], P[MAX]; ll B[MAX], T[MAX], Q[MAX]; ll sumA[MAX], sumB[MAX], ans; ll tree[4*MAX], lazy1[4*MAX], lazy2[4*MAX]; void update_lazy(int node, int s, int e, int type) { if(type == 1) { tree[node] = max(tree[node], lazy2[node]); tree[node] += lazy1[node]; } else { tree[node] += lazy1[node]; tree[node] = max(tree[node], lazy2[node]); } if(s != e) { lazy1[node*2] += lazy1[node]; lazy1[node*2+1] += lazy1[node]; lazy2[node*2] = max(lazy2[node*2], lazy2[node]); lazy2[node*2+1] = max(lazy2[node*2+1], lazy2[node]); } lazy1[node] = 0; lazy2[node] = -LINF; } void update1(int node, int s, int e, int r, ll val) { update_lazy(node, s, e, 1); if(s > r) return; if(e <= r) { lazy1[node] += val; update_lazy(node, s, e, 1); return; } int mi = (s + e) / 2; update1(node*2, s, mi, r, val); update1(node*2+1, mi+1, e, r, val); tree[node] = max(tree[node*2], tree[node*2+1]); } void update2(int node, int s, int e, int l, ll val) { update_lazy(node, s, e, 2); if(e <= l) return; if(s > l) { lazy2[node] = max(lazy2[node], val); update_lazy(node, s, e, 2); return; } int mi = (s + e) / 2; update2(node*2, s, mi, l, val); update2(node*2+1, mi+1, e, l, val); tree[node] = max(tree[node*2], tree[node*2+1]); } ll cal(int node, int s, int e, int l, int r) { update_lazy(node, s, e, 2); if(s > r || e < l) return -LINF; if(s >= l && e <= r) return tree[node]; int mi = (s + e) / 2; return max(cal(node*2, s, mi, l, r), cal(node*2+1, mi+1, e, l, r)); } struct point { int x, y; ll val; point(int x, int y, ll val) : x(x), y(y), val(val) {} }; vector <point> po; int main() { ios::sync_with_stdio(false); cin.tie(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]; ans += Q[i]; } for(int i = 1; i <= n; i++) { int temp = upper_bound(sumB, sumB+m+1, S[i] - sumA[i]) - sumB - 1; if(temp >= 0) po.eb(i, temp, P[i]); } for(int i = 1; i <= m; i++) { int temp = upper_bound(sumA, sumA+n+1, T[i] - sumB[i]) - sumA - 1; if(temp < 0) ans -= Q[i]; else if(temp < n) po.eb(temp+1, i-1, -Q[i]); } sort(all(po), [](point a, point b) { if(a.x == b.x) return a.y > b.y; return a.x < b.x; }); ll rem = 0; for(int i = 0; i < po.size(); i++) { if(i+1 < po.size() && po[i].x == po[i+1].x && po[i].y == po[i+1].y) { rem += po[i].val; continue; } update1(1, 0, m, po[i].y, po[i].val + rem); update2(1, 0, m, po[i].y, cal(1, 0, m, 0, po[i].y)); rem = 0; } cout << cal(1, 0, m, m, m) + ans; }

Compilation message (stderr)

dishes.cpp: In function 'int main()':
dishes.cpp:113:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < po.size(); i++) {
                    ~~^~~~~~~~~~~
dishes.cpp:114:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(i+1 < po.size() && po[i].x == po[i+1].x && po[i].y == po[i+1].y) {
            ~~~~^~~~~~~~~~~
#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...