Submission #289956

#TimeUsernameProblemLanguageResultExecution timeMemory
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...