Submission #686769

#TimeUsernameProblemLanguageResultExecution timeMemory
686769wenqiTwo Dishes (JOI19_dishes)C++17
100 / 100
4539 ms259900 KiB
// trans rights
 
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
constexpr ll L = 1e16 + 69;
 
struct Node
{
    ll mx;
    ll lazy_sum, lazy_mx;
};
 
vector<Node> nodes(5000000);
 
void clean(int i, int l, int r)
{
    auto &node = nodes[i];
    node.mx += node.lazy_sum;
    node.mx = max(node.mx, node.lazy_mx);
    if (l != r)
    {
        int lc = 2 * i;
        int rc = 2 * i + 1;
        nodes[lc].lazy_mx = max(nodes[lc].lazy_mx + node.lazy_sum, node.lazy_mx);
        nodes[rc].lazy_mx = max(nodes[rc].lazy_mx + node.lazy_sum, node.lazy_mx);
        nodes[lc].lazy_sum += node.lazy_sum;
        nodes[rc].lazy_sum += node.lazy_sum;
    }
    node.lazy_mx = -L, node.lazy_sum = 0;
}
 
void upd(int i, int l, int r, int ql, int qr, ll mx, ll sum)
{
    clean(i, l, r);
    auto &node = nodes[i];
    if (qr < l or ql > r)
        return;
    if (ql <= l and qr >= r)
    {
        node.lazy_mx = max(node.lazy_mx, mx);
        node.lazy_mx += sum;
        node.lazy_sum += sum;
        clean(i, l, r);
        return;
    }
    int lc = 2 * i;
    int rc = 2 * i + 1;
    int m = l + (r - l) / 2;
    upd(lc, l, m, ql, qr, mx, sum);
    upd(rc, m + 1, r, ql, qr, mx, sum);
    node.mx = max(nodes[lc].mx, nodes[rc].mx);
}
 
ll query(int i, int l, int r, int ql, int qr)
{
    clean(i, l, r);
    auto &node = nodes[i];
    if (ql <= l and qr >= r)
        return node.mx;
    int lc = 2 * i;
    int rc = 2 * i + 1;
    int m = l + (r - l) / 2;
    if (ql >= m + 1) return query(rc, m + 1, r, ql, qr);
    if (qr <= m) return query(lc, l, m, ql, qr);
    return max(query(lc, l, m, ql, qr), query(rc, m + 1, r, ql, qr));
}
 
int N, M;
ll A[1000069], B[1000069], S[1000069], T[1000069], P[1000069], Q[1000069];
 
vector<tuple<int, int, int>> lines;
 
int main(int argc, const char *argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        int a, p;
        ll s;
        cin >> a >> s >> p;
        A[i] = a + A[i - 1];
        S[i] = s;
        P[i] = p;
    }
    for (int i = 1; i <= M; i++)
    {
        int b, q;
        ll t;
        cin >> b >> t >> q;
        B[i] = b + B[i - 1];
        T[i] = t;
        Q[i] = q;
    }
    ll base = 0;
    for (int i = 1; i <= N; i++)
    {
        int a = 0, b = M + 2;
        while (b - a > 1)
        {
            int m = a + (b - a) / 2;
            if (A[i] + B[m - 1] > S[i])
                b = m;
            else
                a = m;
        }
        if (a == M + 1)
        {
            base += P[i];
            continue;
        }
        if (a)
            lines.push_back({i, -(a - 1), P[i]});
    }
    for (int i = 1; i <= M; i++)
    {
        int a = 0, b = N + 2;
        while (b - a > 1)
        {
            int m = a + (b - a) / 2;
            if (B[i] + A[m - 1] > T[i])
                b = m;
            else
                a = m;
        }
        if (a == N + 1)
        {
            base += Q[i];
            continue;
        }
        if (a)
        {
            lines.push_back({a, -(i - 1), -Q[i]});
            base += Q[i];
        }
    }
    sort(lines.begin(), lines.end());
    int root = 1;
    for (auto [x, ny, a] : lines)
    {
        int y = -ny;
        upd(root, 0, M, 0, y, -L, a);
        upd(root, 0, M, y + 1, M, query(root, 0, M, 0, y), 0);
    }
    cout << nodes[root].mx + base;
    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...