제출 #1163168

#제출 시각아이디문제언어결과실행 시간메모리
1163168PieArmy금 캐기 (IZhO14_divide)C++20
48 / 100
359 ms327680 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; const ll inf=2e18+5; struct X{ ll tree=-inf,lazy=0; X* lef=NULL; X* rig=NULL; }; struct Seg{ ll n,shift=0; X root; void init(ll N){ n=N; } void push(X &node,ll left,ll right){ if(node.lazy==0)return; node.tree+=node.lazy; if(left!=right){ if(!node.lef)node.lef=new X; node.lef->lazy+=node.lazy; if(!node.rig)node.rig=new X; node.rig->lazy+=node.lazy; } node.lazy=0; } ll l,r,x; void up(X &node,ll left=-inf,ll right=-inf){ if(right==-inf){ left=-n; right=n; } if(left>=l&&right<=r){ node.lazy+=x; push(node,left,right); return; } push(node,left,right); if(left>r||right<l)return; ll mid=(left+right)>>1; if(!node.lef)node.lef=new X; up(*node.lef,left,mid); if(!node.rig)node.rig=new X; up(*node.rig,mid+1,right); node.tree=max(node.lef->tree,node.rig->tree); } void update(ll left,ll right,ll val){ l=left-shift;r=right-shift;x=val; l=max(l,-n); r=min(r,n); up(root); } ll qu(X &node,ll left=-inf,ll right=-inf){ if(right==-inf){ left=-n; right=n; } if(left>r||right<l)return -inf; push(node,left,right); if(left>=l&&right<=r)return node.tree; ll mid=(left+right)>>1; if(!node.lef)node.lef=new X; if(!node.rig)node.rig=new X; return max(qu(*node.lef,left,mid),qu(*node.rig,mid+1,right)); } ll query(ll left,ll right){ l=left-shift;r=right-shift; l=max(l,-n); r=min(r,n); return qu(root); } }; int n; ll ans=0; Seg seg; const ll lim=1e15; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); seg.init(lim); cin>>n; for(int i=0;i<n;i++){ ll x,g,d;cin>>x>>g>>d; ans=max(ans,max(0ll,seg.query(x-d,lim))+g); seg.update(x,x,max(0ll,-seg.query(x,x))); seg.update(-lim,lim,g); seg.shift+=d; } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...