Submission #707660

#TimeUsernameProblemLanguageResultExecution timeMemory
707660PoonYaPatSalesman (IOI09_salesman)C++14
100 / 100
565 ms65536 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef tuple<ll,ll,ll> tu; struct seg { ll up,down; } s[1<<21]; const int mx=500005; const ll mn=-1e18; ll n,u,d,st,best[500010],temp1[500010],temp2[500010]; vector<tu> v; //day, location, profit void update(int l, int r, int idx, int x, ll val_up, ll val_down) { if (l>x || r<x) return; if (l==r) s[idx]={val_up,val_down}; else { int mid=(l+r)/2; update(l,mid,2*idx,x,val_up,val_down); update(mid+1,r,2*idx+1,x,val_up,val_down); s[idx].up=max(s[2*idx].up,s[2*idx+1].up); s[idx].down=max(s[2*idx].down,s[2*idx+1].down); } } seg query(int l, int r, int idx, int x, int y) { if (x>r || y<l) return {mn,mn}; if (x<=l && r<=y) return s[idx]; int mid=(l+r)/2; seg L=query(l,mid,2*idx,x,y), R=query(mid+1,r,2*idx+1,x,y); return {max(L.up,R.up),max(L.down,R.down)}; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); for (int i=0; i<1<<21; ++i) s[i]={mn,mn}; cin>>n>>u>>d>>st; for (int i=0; i<n; ++i) { ll a,b,c; cin>>a>>b>>c; v.push_back(tu(a,b,c)); } v.push_back(tu(mx+2,st,0)); sort(v.begin(),v.end()); update(1,mx,1,st,(mx-st)*u,(st-1)*d); for (int i=0; i<=n; ) { int m=1; while (get<0>(v[i])==get<0>(v[i+m])) ++m; ll mmax_up=mn, mmax_down=mn; for (int j=i; j<i+m; ++j) { ll loc=get<1>(v[j]), profit=get<2>(v[j]); best[j]=max(query(1,mx,1,1,loc).down-(loc-1)*d, query(1,mx,1,loc+1,mx).up-(mx-loc)*u)+profit; temp1[j]=mmax_down-d*(loc-1)+profit; mmax_down=max(mmax_down, max(temp1[j],best[j])+d*(loc-1)); } for (int j=i+m-1; j>=i; --j) { ll loc=get<1>(v[j]), profit=get<2>(v[j]); temp2[j]=mmax_up-u*(mx-loc)+profit; mmax_up=max(mmax_up, max(best[j],temp2[j])+u*(mx-loc)); } for (int j=i; j<i+m; ++j) { best[j]=max({best[j],temp1[j],temp2[j]}); ll loc=get<1>(v[j]); update(1,mx,1,loc,(mx-loc)*u+best[j],(loc-1)*d+best[j]); } i+=m; } cout<<best[n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...