Submission #1158879

#TimeUsernameProblemLanguageResultExecution timeMemory
1158879the_ZHERDivide and conquer (IZhO14_divide)C++20
100 / 100
47 ms6444 KiB
#include <bits/stdc++.h> #define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define int long long using namespace std; const int inf=1e17; const int N=1e5+5; const int N1=1e5+5; const int N2=5e6+6; const int mod=1e9+7; const int k1=447; struct edge{ int d,in; }; struct edge1{ int x,g,d; }; vector<edge1>v; int dp[N]; int dp1[N]; int dp2[N]; int divide(int l,int r){ if(r-l+1==1){ return v[r].g; } int mid=(l+r)/2; int ans=divide(l,mid); int ans1=divide(mid+1,r); vector<pair<int,int> >v2; int sum=0; int cnt=0; for(int i=mid;i>=l;i--){ cnt=dp1[i-1]; sum+=v[i].g; v2.push_back({-cnt+v[i].x,sum}); } sort(v2.begin(),v2.end()); for(int i=v2.size()-1;i>=0;i--){ dp2[i]=v2[i].second; dp2[i]=max(dp2[i],dp2[i+1]); } int ans2=0; sum=0; for(int i=mid+1;i<=r;i++){ int l1=0,r1=v2.size()-1; int cnt=v[i].x-dp1[i]; sum+=v[i].g; while(l1+1<r1){ int mid1=(l1+r1)/2; if(cnt>v2[mid1].first){ l1=mid1; }else{ r1=mid1; } } if(cnt<=v2[l1].first){ r1=l1; } if(cnt<=v2[r1].first){ ans2=max(ans2,sum+dp2[r1]); } } for(int i=0;i<=v2.size();i++){ dp2[i]=0; } v2.clear(); return max({ans,ans1,ans2}); } signed main(){ boost; int n; cin>>n; v.push_back({0,0,0}); for(int i=1;i<=n;i++){ edge1 x; cin>>x.x>>x.g>>x.d; dp[i]=dp[i-1]+x.g; dp1[i]=dp1[i-1]+x.d; v.push_back(x); } int ans=divide(1,n); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...