제출 #366910

#제출 시각아이디문제언어결과실행 시간메모리
366910valerikkTwo Dishes (JOI19_dishes)C++17
100 / 100
4681 ms144512 KiB
#include <bits/stdc++.h>

typedef long long ll;

#define set set1

using namespace std;

const int N = 1e6 + 7;
const ll INF = 1e18 + 100;

ll mx[4 * N];
ll delta[4 * N];

void apply(int v, ll val) {
    mx[v] += val;
    delta[v] += val;
}

void push(int v) {
    apply(2 * v, delta[v]);
    apply(2 * v + 1, delta[v]);
    delta[v] = 0;
}

void modify(int v, int tl, int tr, int l, int r, ll val) {
    if (tl >= r || tr <= l)
        return;
    if (tl >= l && tr <= r) {
        apply(v, val);
        return;
    }
    push(v);
    int tm = (tl + tr) / 2;
    modify(2 * v, tl, tm, l, r, val);
    modify(2 * v + 1, tm, tr, l, r, val);
    mx[v] = max(mx[2 * v], mx[2 * v + 1]);
}

void set(int v, int l, int r, int pos, ll val) {
    if (r - l == 1) {
        mx[v] = max(mx[v], val);
    } else {
        push(v);
        int m = (l + r) / 2;
        if (pos < m)
            set(2 * v, l, m, pos, val);
        else 
            set(2 * v + 1, m, r, pos, val);
        mx[v] = max(mx[2 * v], mx[2 * v + 1]);
    }
}

ll query(int v, int tl, int tr, int l, int r) {
    if (tl >= r || tr <= l)
        return -INF;
    if (tl >= l && tr <= r)
        return mx[v];
    push(v);
    int tm = (tl + tr) / 2;
    return max(query(2 * v, tl, tm, l, r), query(2 * v + 1, tm, tr, l, r));
}

int n, m;
ll a[N], b[N];
ll s[N], t[N];
ll p[N], q[N];

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif
    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];
        a[i] += a[i - 1];
    }
    for (int i = 1; i <= m; ++i) {
        cin >> b[i] >> t[i] >> q[i];
        b[i] += b[i - 1];
    }
    ll sum = 0;
    vector<pair<pair<int, int>, ll>> events;
    for (int i = 1; i <= n; i++) {
        if (a[i] > s[i])
            continue;
        // cout << "Donburi " << i << endl;
        int ind = upper_bound(b, b + m + 1, s[i] - a[i]) - b - 1;
        if (ind == m)
            sum += p[i];
        else 
            events.push_back({{i, -ind}, p[i]});
    }
    for (int i = 1; i <= m; i++) {
        if (b[i] > t[i]) 
            continue;
        // cout << "Curry " << i << endl;
        int ind = upper_bound(a, a + n + 1, t[i] - b[i]) - a - 1;
        sum += q[i];
        if (ind != n)
            events.push_back({{ind + 1, -(i - 1)}, -q[i]});
    }
    sort(events.begin(), events.end());
    /* vector<pair<pair<int, int>, ll>> temp;
    for (auto &ev : events) {
        if (temp.empty() || ev.first != temp.back().first)
            temp.push_back(ev);
        else 
            temp.back().second += ev.second;
    }
    events = temp; */
    for (auto &ev : events) {
        int pos = -ev.first.second;
        ll val = ev.second;
        ll down = query(1, 0, m + 1, 0, pos + 1);
        modify(1, 0, m + 1, 0, pos + 1, val);
        if (pos != m)
            set(1, 0, m + 1, pos + 1, down);
        /* for (int i = 0; i <= m; i++) 
            cout << query(1, 0, m + 1, i, i + 1) << " ";
        cout << endl; */
    }
    cout << sum + mx[1] << endl;
    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...