Submission #1162301

#TimeUsernameProblemLanguageResultExecution timeMemory
1162301irmuunFish 3 (JOI24_fish3)C++20
27 / 100
322 ms43936 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() struct lazySeg{ ll n; vector<ll>d,lazy; lazySeg(ll n){ d.resize(4*n); lazy.resize(4*n); } void push(ll v,ll l,ll r){ ll mid=(l+r)>>1; d[v<<1]+=lazy[v]*(mid-l+1); lazy[v<<1]+=lazy[v]; d[v<<1|1]+=lazy[v]*(r-mid); lazy[v<<1|1]+=lazy[v]; lazy[v]=0; } ll query(ll v,ll l,ll r,ll L,ll R){ if(R<L||r<L||R<l) return 0ll; if(L<=l&&r<=R){ return d[v]; } push(v,l,r); ll mid=(l+r)>>1; return query(v<<1,l,mid,L,R)+query(v<<1|1,mid+1,r,L,R); } void update(ll v,ll l,ll r,ll L,ll R,ll val){ if(R<L||r<L||R<l) return; if(L<=l&&r<=R){ d[v]+=(r-l+1)*val; lazy[v]+=val; return; } push(v,l,r); ll mid=(l+r)>>1; update(v<<1,l,mid,L,R,val); update(v<<1|1,mid+1,r,L,R,val); d[v]=d[v<<1]+d[v<<1|1]; } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n,d; cin>>n>>d; ll c[n+5]; for(ll i=1;i<=n;i++){ cin>>c[i]; } ll q; cin>>q; vector<pair<ll,ll>>ask[n+5]; vector<ll>ans(q); for(ll i=0;i<q;i++){ ll l,r; cin>>l>>r; ask[r].pb({l,i}); } lazySeg sg(n); vector<pair<ll,ll>>block; for(ll R=1;R<=n;R++){ if(block.empty()||c[R-1]+d<=c[R]){ block.pb({R,R}); } else{ if(c[R-1]<=c[R]){ block.back().ss++; } else{ ll need=(c[R-1]-c[R]+d-1)/d; { ll l=block.back().ff,r=block.back().ss; sg.update(1,1,n,l,r,need); } while(block.size()>=2){ ll l=block[block.size()-2].ff,r=block[block.size()-2].ss; { ll x=c[r]-sg.query(1,1,n,r,r)*d,y=c[r+1]-sg.query(1,1,n,r+1,r+1)*d; if(x+d<=y){ break; } else{ if(x<=y){ block[block.size()-2].ss=block.back().ss; block.pop_back(); break; } else{ ll cnt=(x-y+d-1)/d; sg.update(1,1,n,block.back().ff,block.back().ss,cnt); block[block.size()-2].ss=block.back().ss; block.pop_back(); } } } } block.back().ss=R; } } for(auto [L,i]:ask[R]){ if(c[L]-sg.query(1,1,n,L,L)*d<0){ ans[i]=-1; } else{ ans[i]=sg.query(1,1,n,L,R); } } } for(ll i=0;i<q;i++){ cout<<ans[i]<<"\n"; } }
#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...