Submission #1315725

#TimeUsernameProblemLanguageResultExecution timeMemory
1315725abcd123456Bulldozer (JOI17_bulldozer)C++20
0 / 100
2 ms956 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...