Submission #524708

#TimeUsernameProblemLanguageResultExecution timeMemory
524708DeepessonSalesman (IOI09_salesman)C++17
62 / 100
676 ms52728 KiB
#include <bits/stdc++.h> #define MAX 505000 using ll = long long; ll inf = (1e9); struct Seg3 { ll tab[MAX*4]; void update(int t,ll k,int la=0,int ra=MAX-1,int pos=1){ if(la>t||ra<t)return; if(la==ra){ tab[pos]=std::max(tab[pos],k); return; } int m = (la+ra)/2; update(t,k,la,m,pos*2); update(t,k,m+1,ra,(pos*2)+1); tab[pos]=std::max(tab[pos*2],tab[(pos*2)+1]); } ll query(int l,int r,int la=0,int ra=MAX-1,int pos=1){ if(la>r||ra<l)return -inf; if(la>=l&&ra<=r){ return tab[pos]; } int m = (la+ra)/2; return std::max(query(l,r,la,m,pos*2),query(l,r,m+1,ra,(pos*2)+1)); } void iniciar(void){ for(auto&x:tab)x=-inf; } }; ll U,D; ll Q,S; Seg3 upper,down; typedef std::pair<ll,ll> pll; typedef std::pair<ll,pll> plp; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); upper.iniciar(); down.iniciar(); std::cin>>Q>>D>>U>>S; upper.update(S,+(U*S)); down.update(S,-(D*S)); std::vector<plp> eventos; eventos.push_back(plp(1e9,pll(S,0))); for(int i=0;i!=Q;++i){ ll D,L,X; std::cin>>D>>L>>X; eventos.push_back({D,{L,X}}); } std::sort(eventos.begin(),eventos.end()); ll last=0; for(auto&x:eventos){ ll local = x.second.first; ll bonus = x.second.second; ll descer = down.query(local,MAX-1); ll subir = upper.query(0,local-1); ll ans = std::max(descer+bonus+(D*local),subir+bonus-(U*local)); last=ans; /// std::cout<<"Valor desce: "<<descer-bonus+(D*local)<<"\n"; /// std::cout<<"D: "<<descer<<" "<<"S: "<<subir<<"\n"; /// std::cout<<"Dia "<<x.first<<" Lucro: "<<ans<<" "<<local<<"\n"; down.update(local,ans-(D*local)); upper.update(local,ans+(U*local)); } std::cout<<last<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...