# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
487956 | ToroTN | Salesman (IOI09_salesman) | C++14 | 1096 ms | 36004 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |