#include <bits/stdc++.h>
#define itachi ios::sync_with_stdio(0);cin.tie(0);
#define int long long
using namespace std;
const int MAXN = 2005;
const long double PI = acosl(-1.0L);
const long double EPS = 1e-12;
int n;
int X[MAXN], Y[MAXN], W[MAXN];
struct Node {
int sum, pre, suf, best;
Node(int v=0){
sum = v;
pre = suf = best = max(0LL, v);
}
};
Node st[4*MAXN];
Node merge(const Node &L, const Node &R){
Node res;
res.sum = L.sum + R.sum;
res.pre = max(L.pre, L.sum + R.pre);
res.suf = max(R.suf, R.sum + L.suf);
res.best = max({L.best, R.best, L.suf + R.pre});
return res;
}
void build(int id,int l,int r,vector<int> &a){
if(l==r){ st[id]=Node(a[l]); return; }
int m=(l+r)>>1;
build(id<<1,l,m,a);
build(id<<1|1,m+1,r,a);
st[id]=merge(st[id<<1],st[id<<1|1]);
}
void update(int id,int l,int r,int p,int v){
if(l==r){ st[id]=Node(v); return; }
int m=(l+r)>>1;
if(p<=m) update(id<<1,l,m,p,v);
else update(id<<1|1,m+1,r,p,v);
st[id]=merge(st[id<<1],st[id<<1|1]);
}
struct Event{
long double ang;
int u,v;
bool operator<(const Event& o)const{
if(fabsl(ang-o.ang)>EPS) return ang<o.ang;
return u<o.u;
}
};
signed main(){
itachi
cin>>n;
for(int i=1;i<=n;i++) cin>>X[i]>>Y[i]>>W[i];
vector<Event> ev;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
long double ang = atan2l(Y[j]-Y[i], X[j]-X[i]);
if(ang<0) ang+=PI;
ev.push_back({ang,i,j});
}
sort(ev.begin(),ev.end());
vector<int> ord(n+1), pos(n+1);
iota(ord.begin()+1, ord.end(), 1);
sort(ord.begin()+1, ord.end(), [&](int a,int b){
if(X[a]!=X[b]) return X[a]<X[b];
return Y[a]<Y[b];
});
for(int i=1;i<=n;i++) pos[ord[i]]=i;
vector<int> a(n+1);
for(int i=1;i<=n;i++) a[i]=W[ord[i]];
build(1,1,n,a);
int ans = st[1].best;
for(int i=0;i<(int)ev.size();){
int j=i;
while(j<(int)ev.size() && fabsl(ev[j].ang-ev[i].ang)<=EPS) j++;
vector<pair<int,int>> sw;
for(int k=i;k<j;k++){
int u=ev[k].u, v=ev[k].v;
int pu=pos[u], pv=pos[v];
if(pu!=pv) sw.push_back({min(pu,pv), max(pu,pv)});
}
sort(sw.begin(), sw.end());
for(auto [pu,pv]:sw){
swap(ord[pu], ord[pv]);
pos[ord[pu]]=pu;
pos[ord[pv]]=pv;
update(1,1,n,pu,W[ord[pu]]);
update(1,1,n,pv,W[ord[pv]]);
}
ans=max(ans,st[1].best);
i=j;
}
cout<<ans;
}
| # | 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... |