Submission #1269254

#TimeUsernameProblemLanguageResultExecution timeMemory
1269254MMihalevBulldozer (JOI17_bulldozer)C++20
25 / 100
2062 ms589824 KiB
#include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<unordered_map> #include<map> using namespace std; const int MAX_N=2e3+2; const long long INF=(1LL<<62); int n; long long x[MAX_N]; long long y[MAX_N]; long long cost[MAX_N],ans; int pos[MAX_N]; vector<pair<pair<long long,int>,long long>>order; struct V { long long pref,suf,sum,sub; }; V tree[4*MAX_N]; void Update(int node,int l,int r,int idx,long long val) { if(l==r) { tree[node].pref=val;tree[node].suf=val;tree[node].sum=val;tree[node].sub=val; return; } int mid=(l+r)/2; if(idx<=mid)Update(2*node,l,mid,idx,val); else Update(2*node+1,mid+1,r,idx,val); tree[node].sum=tree[2*node].sum+tree[2*node+1].sum; tree[node].pref=max(tree[2*node].pref,tree[2*node].sum+tree[2*node+1].pref); tree[node].suf=max(tree[2*node+1].suf,tree[2*node+1].sum+tree[2*node].suf); tree[node].sub=max(tree[2*node].sub,tree[2*node+1].sub); tree[node].sub=max(tree[node].sub,tree[2*node].suf+tree[2*node+1].pref); } long long query() { return tree[1].sub; } vector<vector<int>>currentpoints; void swp(int i,int j) { Update(1,1,n,pos[i]+1,cost[j]); Update(1,1,n,pos[j]+1,cost[i]); swap(pos[i],pos[j]); } bool cmp(int i,int j) { return pos[i]<pos[j]; } void solvefor() { ans=max(ans,query()); for(auto current:currentpoints) { sort(current.begin(),current.end(),cmp); for(int i=0;i<current.size()/2;i++) { swp(current[i],current[current.size()-1-i]); } } ans=max(ans,query()); } void solve() { for(int i=1;i<=n;i++) { order.push_back({{x[i],-y[i]},cost[i]}); } sort(order.begin(),order.end()); for(int i=0;i<n;i++) { Update(1,1,n,i+1,order[i].second); for(int idx=1;idx<=n;idx++) { if(order[i].first.first==x[idx] && -order[i].first.second==y[idx]) { pos[idx]=i; break; } } } ans=0; //vector<pair<pair<double,double>,pair<int,int>>>lines; unordered_map<double,unordered_map<int,bool>>horizontalstuff; map<double,unordered_map<double,unordered_map<int,bool>>>allstuff; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { double A=1.0*y[i]-1.0*y[j]; double B=1.0*x[j]-1.0*x[i]; double C=-A*x[i]-B*y[i]; if(B==0) { horizontalstuff[C][i]=1; horizontalstuff[C][j]=1; continue; } allstuff[-(A/B)][C][i]=1; allstuff[-(A/B)][C][j]=1; //lines.push_back({{-(A/B),C},{i,j}}); } } //sort(lines.begin(),lines.end()); vector<int>current; for(auto&[C,idxes]:horizontalstuff) { current.clear(); for(auto&[idx,val]:idxes) { current.push_back(idx); } currentpoints.push_back(current); } solvefor(); for(auto&[A,Ces]:allstuff) { currentpoints.clear(); for(auto&[C,idxes]:Ces) { current.clear(); for(auto&[idx,val]:idxes) { current.push_back(idx); } currentpoints.push_back(current); } solvefor(); } cout<<ans<<"\n"; } int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n; for(int i=1;i<=n;i++) { cin>>x[i]>>y[i]>>cost[i]; } solve(); return 0; }
#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...