Submission #487956

#TimeUsernameProblemLanguageResultExecution timeMemory
487956ToroTNSalesman (IOI09_salesman)C++14
60 / 100
1096 ms36004 KiB
#include<bits/stdc++.h> using namespace std; int n,d,u,s,l,m,t_i,l_i,m_i,seg1[2000005],seg2[2000005],num1[500005],num2[500005]; vector<pair<int,int> > v[500005]; void build(int tree,int st,int ed) { int md=(st+ed)/2; if(st==ed) { if(st<=s) { seg1[tree]=u*(500002-s); }else { seg1[tree]=-1e9; } if(st>=s) { seg2[tree]=d*s; }else { seg2[tree]=-1e9; } return; } build(2*tree,st,md); build(2*tree+1,md+1,ed); seg1[tree]=max(seg1[2*tree],seg1[2*tree+1]); seg2[tree]=max(seg2[2*tree],seg2[2*tree+1]); } void update1(int tree,int st,int ed,int idx,int val) { int md=(st+ed)/2; if(st==ed) { seg1[tree]=max(seg1[tree],val); return; } if(idx<=md) { update1(2*tree,st,md,idx,val); }else { update1(2*tree+1,md+1,ed,idx,val); } seg1[tree]=max(seg1[2*tree],seg1[2*tree+1]); } void update2(int tree,int st,int ed,int idx,int val) { int md=(st+ed)/2; if(st==ed) { seg2[tree]=max(seg2[tree],val); return; } if(idx<=md) { update2(2*tree,st,md,idx,val); }else { update2(2*tree+1,md+1,ed,idx,val); } seg2[tree]=max(seg2[2*tree],seg2[2*tree+1]); } int query1(int tree,int st,int ed,int l,int r) { int md=(st+ed)/2; if(st>r||ed<l) { return -1e9; } if(st>=l&&ed<=r) { return seg1[tree]; } return max(query1(2*tree,st,md,l,r),query1(2*tree+1,md+1,ed,l,r)); } int query2(int tree,int st,int ed,int l,int r) { int md=(st+ed)/2; if(st>r||ed<l) { return -1e9; } if(st>=l&&ed<=r) { return seg2[tree]; } return max(query2(2*tree,st,md,l,r),query2(2*tree+1,md+1,ed,l,r)); } void debug(int tree,int st,int ed) { int md=(st+ed)/2; if(st==ed) { printf("%d %d %d\n",st,seg1[tree],seg2[tree]); return; } debug(2*tree,st,md); debug(2*tree+1,md+1,ed); } int main() { scanf("%d%d%d%d",&n,&u,&d,&s); for(int i=1;i<=n;i++) { scanf("%d%d%d",&t_i,&l_i,&m_i); v[t_i].push_back({l_i,m_i}); } for(int i=1;i<=500000;i++) { sort(v[i].begin(),v[i].end()); } build(1,1,500001); //printf("%lld\n",max(query2(1,1,500001,1,s)-d*s,query1(1,1,500001,s,500001)-u*(500002-s))); for(int i=1;i<=500000;i++) { for(int j=0;j<v[i].size();j++) { l=v[i][j].first; num1[j]=query1(1,1,500001,l,500001); num2[j]=query2(1,1,500001,1,l); } for(int j=0;j<v[i].size();j++) { //printf("%d %lld %lld\n",i,l[i],m[i]); m=v[i][j].second; update1(1,1,500001,l,m+num1[j]); update1(1,1,500001,l,m+num2[j]-d*l+u*(500002-l)); update2(1,1,500001,l,m+num2[j]); update2(1,1,500001,l,m+num1[j]-u*(500002-l)+d*l); //debug(1,1,500001); } for(int j=v[i].size()-1;j>=0;j--) { //printf("%d %lld %lld\n",i,l[i],m[i]); m=v[i][j].second; update1(1,1,500001,l,m+num1[j]); update1(1,1,500001,l,m+num2[j]-d*l+u*(500002-l)); update2(1,1,500001,l,m+num2[j]); update2(1,1,500001,l,m+num1[j]-u*(500002-l)+d*l); //debug(1,1,500001); } } printf("%d\n",max(query2(1,1,500001,1,s)-d*s,query1(1,1,500001,s,500001)-u*(500002-s))); }

Compilation message (stderr)

salesman.cpp: In function 'int main()':
salesman.cpp:118:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |         for(int j=0;j<v[i].size();j++)
      |                     ~^~~~~~~~~~~~
salesman.cpp:124:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |         for(int j=0;j<v[i].size();j++)
      |                     ~^~~~~~~~~~~~
salesman.cpp:104:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |     scanf("%d%d%d%d",&n,&u,&d,&s);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:107:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         scanf("%d%d%d",&t_i,&l_i,&m_i);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...