Submission #1369043

#TimeUsernameProblemLanguageResultExecution timeMemory
1369043vjudge1Divide and conquer (IZhO14_divide)C++20
17 / 100
1 ms344 KiB
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
// ???????????????????????????????????????????????????????????
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define tos to_string
#define __lcm(x, y) ((x /__gcd(x, y)) * y)
// #pragma GCC optimize ("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define int long long
#define abs llabs
#define all(v) v.begin(), v.end()
const int N = 1E5 + 5, M = 1E5 + 5, LOG = 30;
const int inf = 1E18, MOD = 1E9 + 7, MOD1 = 998244353;

struct seg {
    int lx, rx, d, g;
};

bool cmp(seg x, seg y) {
    return x.lx < y.lx;
}

vector<seg> get(vector<seg> v) {

    int sz = v.size();
    if (sz == 1) {
        return v;
    }

    int m = (sz >> 1);
    vector<seg> tmpl, tmpr, comb;

    for (int i = 0; i < sz; i++) {
        if (i < m) tmpl.push_back(v[i]);
        else tmpr.push_back(v[i]);
    }

    vector<seg> l = get(tmpl), r = get(tmpr);

    int ptr1 = l.size() - 1, szr = r.size(), ptr2 = 1;
    auto [cl, cr, cd, cg] = r[0];
    bool ok = 0;

    while (ptr1 >= 0 || ptr2 < szr) {

        bool changed = 0;

        if (ptr1 >= 0) {
            auto [llx, lrx, ld, lg] = l[ptr1];
            if (lrx + ld >= cl - cd) {
                cd += ld - (cl - llx);
                cl = llx;
                cg += lg;
                changed = 1;
                ptr1--;
            }
        }

        if (ptr2 < szr) {
            auto [rlx, rrx, rd, rg] = r[ptr2];
            if (cr + cd >= rlx - rd) {
                cd += rd - (rlx - cr);
                cr = rrx;
                cg += rg;
                changed = 1;
                ptr2++;
            }
        }

        if (!changed) {
            comb.push_back({cl, cr, cd, cg});
            ok = 1;
            break;
        }
    }

    if (!ok) {
        comb.push_back({cl, cr, cd, cg});
    }

    while (ptr1 >= 0) {
        comb.push_back(l[ptr1]);
        ptr1--;
    }

    while (ptr2 < szr) {
        comb.push_back(r[ptr2]);
        ptr2++;
    }

    sort(all(comb), cmp);

    
    return comb;

}

void solve() {
    int n;
    cin >> n;
    vector<seg> v(n);
    for (int i = 0; i < n; i++) {
        int pos, g, d;
        cin >> pos >> g >> d;
        v[i] = {pos, pos, d, g};
    }

    vector<seg> res = get(v);

    int ans = 0;
    for (auto [lx, rx, d, g] : res) {
        ans = max(ans, g);
    }
    cout << ans << "\n";
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int ttt = 1;
    // cin >> ttt;
    while(ttt--) {
        solve();
    }
}
/*

----x-  --x-    -x-------------x

*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...