제출 #289956

#제출 시각아이디문제언어결과실행 시간메모리
289956MasterTasterDivide and conquer (IZhO14_divide)C++14
100 / 100
65 ms11760 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define pii pair<int, int>
#define xx first
#define yy second
#define endl "\n"

ll n, x[100010], g[100010], e[100010], ress, prefG[100010], seg[400010], poz[400010];
vector< pair<ll ,int> > prefiksi;

void build(int node, int l, int r)
{
    if (l==r)
    {
        seg[node]=prefiksi[l].yy;
        return;
    }
    int mid=l+(r-l)/2;
    build(2*node, l, mid);
    build(2*node+1, mid+1, r);
    seg[node]=min(seg[2*node], seg[2*node+1]);
}
int query(int node, int l, int r, int levo, int desno) ///[l, r]-gde sam u segmentnom; [levo, desno]-query
{
    if (levo>r || desno<l) return n+1;
    if (levo<=l && desno>=r) return seg[node];

    int mid=l+(r-l)/2;
    return min(query(2*node, l, mid, levo, desno),
               query(2*node+1, mid+1, r, levo, desno));
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    cin>>n;
    for (int i=0; i<n; i++) cin>>x[i]>>g[i]>>e[i];

    prefG[0]=g[0];
    for (int i=1; i<n; i++)
    {
        prefG[i]=prefG[i-1]+g[i];
    }

    ll energy=0, dist=0;
    prefiksi.pb({0-x[0], 0});
    for (int i=1; i<n; i++)
    {
        energy+=e[i-1];
        dist=x[i];
        prefiksi.pb({energy-dist, i});
    }

    sort(prefiksi.begin(), prefiksi.end());

    build(1, 0, n-1);

    vector<int> prviClan;
    for (int i=0; i<n; i++) prviClan.pb(prefiksi[i].xx);

    energy=0, dist=0;
    for (int i=0; i<n; i++)
    {
        dist=x[i];
        energy+=e[i];
        ll razl=energy-dist;
        auto it=upper_bound(prviClan.begin(), prviClan.end(), razl);
        if (it==prviClan.end()) { poz[i]=prefiksi.size()-1; }
        else
        {
            if (distance(prviClan.begin(), it)==0) { poz[i]=-1; continue; }
            poz[i]=distance(prviClan.begin(), it)-1;
        }
    }

    for (int i=0; i<n; i++)
    {
        if (poz[i]==-1) continue;
        int j=query(1, 0, n-1, 0, poz[i]);
        if (j>i) continue;
        else
        {
            ll koliko=prefG[i];
            if (j>0) koliko-=prefG[j-1];
            ress=max(ress, koliko);
        }
    }

    for (int i=0; i<n; i++) ress=max(ress, g[i]);
    /*for (int i=0; i<n; i++)
    {
        ll trGold=0, trEnergy=0, trDist=0;
        for (int j=i; j<n; j++)
        {
            trDist=x[j]-x[i];
            trEnergy+=e[j];
            trGold+=g[j];

            //cout<<i<<" "<<j<<" "<<trDist<<" "<<trGold<<" "<<trEnergy<<endl;
            if (trEnergy>=trDist) ress=max(ress, trGold);
        }
    }*/
    cout<<ress;
}
/*if (i) energy+=e[i-1];
        dist=x[i];

        //cout<<energy<<" "<<dist<<endl;
        pair<ll, ll> p;
        auto it=s.upper_bound({energy+e[i]-x[i], 1});
        if (it==s.end())
        {
            //cout<<"ee"<<i<<endl;
            p=*s.rbegin();
        }
        else
        {
            //cout<<"eee"<<i<<endl;
            if (it!=s.begin())
            {
                //cout<<"r"<<i<<endl;
                it--;
                p=*it;
            }
            else
            {
                s.insert({energy-dist, -i});
                continue;
            }
        }


        ll trRess=prefG[i];
        if (-p.yy>0) trRess-=prefG[-p.yy-1];

        ress=max(ress, trRess);

        //cout<<"ubacujem "<<energy-dist<<" "<<-i<<endl;
        s.insert({energy-dist, -i});*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...