Submission #296873

#TimeUsernameProblemLanguageResultExecution timeMemory
296873YJUTriple Jump (JOI19_jumps)C++14
100 / 100
1492 ms126696 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; typedef long double ld; const ll MOD=1e9+7; const ll N=1e6+5; const ld pi=3.14159265359; const ll INF=(1LL<<62); #define REP(i,n) for(ll i=0;i<n;i++) #define REP1(i,n) for(ll i=1;i<=n;i++) #define pb push_back #define mp make_pair #define X first #define Y second #define setp setprecision #define lwb lower_bound #define SZ(a) (ll)a.size() ll seg[4*N],tag[4*N],n,u[N],m,lst,ans[N],pseg[4*N]; vector<pll> upd[N]; pair<pll,ll> q[N]; stack<pll> stk; void push(ll id){ tag[id*2]=max(tag[id*2],tag[id]); tag[id*2+1]=max(tag[id*2+1],tag[id]); seg[id*2]=max(seg[id*2],pseg[id*2]+tag[id*2]);seg[id*2+1]=max(seg[id*2+1],pseg[id*2+1]+tag[id*2+1]); } void add(ll id,ll l,ll r,ll ql,ll qr,ll D){ if(l>=ql&&r<=qr){ tag[id]=max(tag[id],D); push(id); seg[id]=max(seg[id*2],seg[id*2+1]); seg[id]=max(seg[id],pseg[id]+tag[id]); //cout<<id<<" "<<l<<" "<<r<<" "<<seg[id]<<"\n"; return ; } if(l>=qr||r<=ql)return ; push(id); ll mid=(l+r)/2; add(id*2,l,mid,ql,qr,D); add(id*2+1,mid,r,ql,qr,D); seg[id]=max(seg[id*2],seg[id*2+1]); //cout<<id<<" "<<l<<" "<<r<<" "<<seg[id]<<"\n"; } void pins(ll id,ll l,ll r,ll to,ll D){ if(l==r-1){pseg[id]=max(pseg[id],D);return ;} ll mid=(l+r)/2; if(to<mid){ pins(id*2,l,mid,to,D); }else{ pins(id*2+1,mid,r,to,D); } pseg[id]=max(pseg[id*2],pseg[id*2+1]); } ll Q(ll id,ll l,ll r,ll ql,ll qr){ //cout<<id<<" "<<l<<" "<<r<<" "<<seg[id]<<"\n"; if(l>=ql&&r<=qr)return seg[id]; if(l>=qr||r<=ql)return 0; push(id); ll mid=(l+r)/2; return max(Q(id*2,l,mid,ql,qr),Q(id*2+1,mid,r,ql,qr)); } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; lst=n; REP1(i,n)cin>>u[i],pins(1,1,n+1,i,u[i]); REP1(i,n){ while(SZ(stk)&&stk.top().X<=u[i]){ upd[stk.top().Y].pb(mp(i,stk.top().X+u[i])); stk.pop(); } if(SZ(stk)){upd[stk.top().Y].pb(mp(i,stk.top().X+u[i]));} stk.push(mp(u[i],i)); } cin>>m; REP(i,m)cin>>q[i].X.X>>q[i].X.Y,q[i].Y=i; sort(q,q+m,[](pair<pll,ll> A,pair<pll,ll> B){ return (A.X.X>B.X.X); }); REP(i,m){ //cout<<"que : "<<q[i].X.X<<" "<<q[i].X.Y<<"\n"; while(lst>=q[i].X.X){ for(auto j:upd[lst]){ if(j.X+j.X-lst>=n+1)continue; //cout<<"upd : "<<j.X<<" "<<2*j.X-lst<<" "<<j.Y<<"\n"; add(1,1,n+1,2*j.X-lst,n+1,j.Y); } --lst; } ans[q[i].Y]=Q(1,1,n+1,q[i].X.X+2,q[i].X.Y+1); } REP(i,m)cout<<ans[i]<<"\n"; return 0; } /* 5 5 2 1 5 3 3 1 5 2 5 1 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...