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;
#define ll long long
#define pb push_back
#define mp make_pair
#define mt make_tuple
const int N=2048;
const int M=2*N;
ll l[M],r[M],sum[M],ans[M];
int A[N];
void pull(int c)
{
ans[c]=max(max(ans[c<<1],ans[c<<1|1]),r[c<<1]+l[c<<1|1]);
l[c]=max(l[c<<1],sum[c<<1]+l[c<<1|1]);
r[c]=max(r[c<<1|1],sum[c<<1|1]+r[c<<1]);
sum[c]=sum[c<<1]+sum[c<<1|1];
}
void Build()
{
for(int i=N;i<M;i++) sum[i]=A[i-N],l[i]=r[i]=ans[i]=max(0,A[i-N]);
for(int i=N-1;i;i--) pull(i);
/*if(ss==se){ sum[c]=A[ss];l[c]=r[c]=ans[c]=max(0,A[ss]);return;}
int mid=ss+se>>1;
Build(c<<1,ss,mid);
Build(c<<1|1,mid+1,se);
pull(c);*/
}
void Set(int qi, int x)
{
qi+=N;sum[qi]=x;l[qi]=r[qi]=ans[qi]=max(x,0);
for(qi>>=1;qi;qi>>=1) pull(qi);
}
/*void Set(int c, int ss, int se, int qi, int x)
{
if(ss==se){ sum[c]=x;l[c]=r[c]=ans[c]=max(0,x);return;}
int mid=ss+se>>1;
if(qi<=mid) Set(c<<1,ss,mid,qi,x);
else Set(c<<1|1,mid+1,se,qi,x);
pull(c);
}*/
struct pt{ ll x,y;pt(){}pt(ll a, ll b):x(a),y(b){}};
bool operator < (pt a, pt b){ return mp(a.y,a.x)<mp(b.y,b.x);}
pt operator - (pt a, pt b){ return pt(a.x-b.x,a.y-b.y);}
ll cross(pt a, pt b){ return a.x*b.y-a.y*b.x;}
ll dot(pt a, pt b){ return a.x*b.x+a.y*b.y;}
ll sq(pt a){ return dot(a,a);}
int part(pt a){ return a<pt(0,0);}
#define ldb double
const ldb PI=acos(-1);
ldb angle(pt a)
{
ldb ang=atan2(a.y,a.x);
if(ang<0) ang+=2*PI;
return ang;
}
bool comp(pt a, pt b){ return mt(part(a),(ll)0,sq(a))<mt(part(b),cross(a,b),sq(b));}
pt P[N];
int w[N],id[N],pos[N];
int main()
{
int n;
scanf("%i",&n);
for(int i=1;i<=n;i++) scanf("%lld %lld %i",&P[i].x,&P[i].y,&w[i]),id[i]=i;
sort(id+1,id+1+n,[&](int i, int j){ return P[i]<P[j];});
for(int i=1;i<=n;i++) A[i]=w[id[i]],pos[id[i]]=i;
Build();
ll sol=ans[1];
vector<pair<pt,pair<int,int>>> events;
vector<int> id;
vector<ldb> ang;
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++)
{
pt d=P[i]-P[j];
if(part(d)==1) d=pt(0,0)-d;
id.pb(events.size()),events.pb({d,{i,j}}),ang.pb(angle(d));
}
//sort(events.begin(),events.end(),[&](pair<pt,pair<int,int>> a, pair<pt,pair<int,int>> b){ return comp(a.first,b.first);});
sort(id.begin(),id.end(),[&](int i, int j){ return ang[i]<ang[j];});
for(int i:id)
{
int x=events[i].second.first;
int y=events[i].second.second;
swap(pos[x],pos[y]);
swap(A[pos[x]],A[pos[y]]);
Set(pos[x],A[pos[x]]);
Set(pos[y],A[pos[y]]);
//printf("SWAP %i %i: %lld\n",x,y,ans[1]);
sol=max(sol,ans[1]);
//for(int z=N+1;z<=N+n;z++) printf("%lld ",sum[z]);
//printf("\n");
}
printf("%lld\n",sol);
return 0;
}
Compilation message (stderr)
bulldozer.cpp: In function 'int main()':
bulldozer.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%i",&n);
~~~~~^~~~~~~~~
bulldozer.cpp:63:70: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i=1;i<=n;i++) scanf("%lld %lld %i",&P[i].x,&P[i].y,&w[i]),id[i]=i;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |