Submission #1288559

#TimeUsernameProblemLanguageResultExecution timeMemory
1288559Faisal_SaqibDivide and conquer (IZhO14_divide)C++20
48 / 100
74 ms15056 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100000+100;
const ll inf=1e18;
ll x[N],e[N],g[N],fen[N*2];
void add(int x,ll p)
{
    while(x<N)
    {
        fen[x]=min(fen[x],p);
        x+=(x&-x);
    }
}
ll get(int x)
{
    ll ans=inf;
    while(x>0)
    {
        ans=min(ans,fen[x]);
        x-=(x&-x);
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(0);
    cout.tie(0);cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>g[i]>>e[i];
        g[i]+=g[i-1];
        e[i]+=e[i-1];
    }
    set<ll> points;
    for(int i=0;i<=n;i++)
    {
        points.insert(e[i]-x[i]);
        if(i)
            points.insert(e[i-1]-x[i]);
    }
    ll ans=-inf;
    for(int i=0;i<2*N;i++)fen[i]=inf;
    vector<ll> cpm(begin(points),end(points));
    for(int i=0;i<=n;i++)
    {
        ll it=lower_bound(begin(cpm),end(cpm),e[i-1]-x[i])-begin(cpm)+1;
        add(it,g[i-1]);
        it=lower_bound(begin(cpm),end(cpm),e[i]-x[i])-begin(cpm)+1;
        ll val=get(it);
        // cout<<"At "<<it<<' '<<e[i]-x[i]<<endl;
        ans=max(ans,g[i]-val);
    }
    cout<<ans<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...