Submission #1155837

#TimeUsernameProblemLanguageResultExecution timeMemory
1155837dostsDivide and conquer (IZhO14_divide)C++20
100 / 100
56 ms10568 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e18,N = 3e3+1,MOD =  998244353;

void solve() {  
    int n;
    cin >> n;
    vi x(n+1),g(n+1),d(n+1);
    for (int i=1;i<=n;i++) cin >> x[i] >> g[i] >> d[i];
    set<pii> st;
    auto ins = [&](int x,int y) {
        auto it = st.lower_bound({x,y});
        if (it != st.end() && it->ss >= y) return;
        st.insert({x,y});
        it = st.lower_bound({x,y});
        while (it != st.begin() && prev(it)->ss <= y) st.erase(prev(it));
    };

    auto get = [&](int x) {
        auto it = st.lower_bound({x,0});
        if (it == st.end()) return 0ll;
        return it->ss;
    };
    vi p(n+1,0),gp(n+1,0);
    for (int i=1;i<=n;i++) p[i] = p[i-1]+d[i];
    for (int i=1;i<=n;i++) gp[i] = gp[i-1]+g[i];
    int ans = 0;
    for (int i=n;i>=1;i--) {
        ins(p[i]-x[i],gp[i]);
        int v = get(p[i-1]-x[i]);
        ans = max(ans,v-gp[i-1]);
    }
    cout << ans << '\n';
}


int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...