제출 #1173925

#제출 시각아이디문제언어결과실행 시간메모리
11739251binTwo Dishes (JOI19_dishes)C++20
0 / 100
497 ms57312 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(v) v.begin(), v.end()
typedef long long ll;
const int b = 1<<20;
const ll inf = 1e18;
ll n, m, A[b], S[b], P[b], sumA[b], sumB[b];
ll B[b], T[b], Q[b];
ll seg[b * 2], ADD[b * 2], MX[b * 2];

void upd_lazy(int ix, int l, int r) {
    if (ADD[ix]) {
        seg[ix] += ADD[ix];
        if (l != r) {
            ADD[ix * 2] += ADD[ix];
            ADD[ix * 2 + 1] += ADD[ix];
            MX[ix * 2] += ADD[ix];
            MX[ix * 2 + 1] += ADD[ix];
        }
        ADD[ix] = 0;
    }
    if (MX[ix] > -inf) {
        seg[ix] = max(seg[ix], MX[ix]);
        if (l != r) {
            MX[ix * 2] = max(MX[ix * 2], MX[ix]);
            MX[ix * 2 + 1] = max(MX[ix * 2 + 1], MX[ix]);
        }
        MX[ix] = -inf * 2;
    }
}

void upd(int ix, int nl, int nr, int l, int r, ll v, int f) {
    upd_lazy(ix, nl, nr);
    if (nl > r || nr < l) return;
    if (nl >= l && nr <= r) {
        if (!f) ADD[ix] += v, MX[ix] += v;
        else MX[ix] = max(MX[ix], v);
        upd_lazy(ix, nl, nr);
        return;
    }
    int m = (nl + nr) / 2;
    upd(ix * 2, nl, m, l, r, v, f);
    upd(ix * 2 + 1, m + 1, nr, l, r, v, f);
    seg[ix] = max(seg[ix * 2], seg[ix * 2 + 1]);
}

ll qry(int ix, int nl, int nr, int l, int r) {
    upd_lazy(ix, nl, nr);
    if (nl > r || nr < l) return -inf;
    if (nl >= l && nr <= r) return seg[ix];
    int m = (nl + nr) / 2;
    return max(qry(ix * 2, nl, m, l, r), qry(ix * 2 + 1, m + 1, nr, l, r));
}

int main(void){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    vector<tuple<ll, ll, ll>> Qry;
    ll sum = 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];
    }
    for (int i = 1; i <= n; i++) {
        ll y = upper_bound(sumB, sumB + m + 1, S[i] - sumA[i]) - sumB - 1;
        if (y >= 0) Qry.emplace_back(i, -y, P[i]);
    }
    for (int i = 1; i <= m; i++) {
        ll x = upper_bound(sumA, sumA + n + 1, T[i] - sumB[i]) - sumA - 1;
        if (x >= 0) {
            sum += Q[i];
            if (x < n) Qry.emplace_back(x + 1, -(i - 1), -Q[i]);
        }
    }

    sort(all(Qry));
    // init
    memset(seg, 0xc1, sizeof(seg));
    memset(MX, 0xc1, sizeof(MX));
    for (int i = 1; i <= n; i++) seg[b + i] = 0;
    for (int i = b - 1; i; i--) seg[i] = max(seg[i * 2], seg[i * 2 + 1]);

    for (auto&[x, y, p] : Qry) {
        y = -y;
        // cout << x << ' ' << y << ' ' << p << endl;
        upd(1, 0, b - 1, 0, y, p, 0); // add
        ll mx = qry(1, 0, b - 1, y, y);
        upd(1, 0, b - 1, y + 1, m, mx, 1); // max
    }
    // cout << sum << ' ';
    cout << sum + qry(1, 0, b - 1, m, m);
    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...