Submission #1257874

#TimeUsernameProblemLanguageResultExecution timeMemory
1257874marizaBouquet (EGOI24_bouquet)C++20
100 / 100
144 ms28612 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MID ((l+r)/2) struct node{ ll val; node *L, *R; void init(ll l, ll r){ val=0; if(l!=r){ L=new node; L->init(l,MID); R=new node; R->init(MID+1,r); } } void upd(ll l, ll r, ll i, ll x){ if(l==i && i==r){ val=max(val,x); } else if(l<=i && i<=r){ L->upd(l,MID,i,x); R->upd(MID+1,r,i,x); val=max(L->val,R->val); } } ll ans(ll l, ll r, ll tl, ll tr){ if(tr-tl+1<=0) return 0; else if(tl<=l && r<=tr) return val; else if(r<tl || tr<l) return 0; else return max(L->ans(l,MID,tl,tr),R->ans(MID+1,r,tl,tr)); } }; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n; cin>>n; ll l[n], r[n]; for(ll i=0; i<n; i++){ cin>>l[i]>>r[i]; l[i]=max(0ll,i-l[i]); r[i]=min(i+r[i],n-1); } ll ans[n]={}; node seg; seg.init(0,n-1); vector<ll> xr[n]; for(ll i=0; i<n; i++){ xr[r[i]].push_back(i); } for(ll pos=n-1; pos>=0; pos--){ for(auto i:xr[pos]){ ans[i]=seg.ans(0,n-1,i+1,n-1)+1; } seg.upd(0,n-1,l[pos],ans[pos]); } ll max_ans=0; for(ll i=0; i<n; i++){ max_ans=max(max_ans,ans[i]); } cout<<max_ans<<endl; }
#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...