제출 #998703

#제출 시각아이디문제언어결과실행 시간메모리
998703tosivanmakFish 3 (JOI24_fish3)C++17
100 / 100
617 ms189508 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll lg[300005];
struct ST{
  vector<vector<ll> >st;
  vector<ll>arr;
    void init(ll n){
        arr.resize(n+5),st.resize(n+5);
        for(int i=0;i<n+5;i++){
            st[i].resize(21);
        }
    }
    void build(ll n){
        for(int i=1;i<=n;i++){
            st[i][0]=arr[i];
        }
        for(int j=1;j<=20;j++){
             for(int i=1;i<=n;i++){
                 if(i+(1<<(j-1))<=n){
                     st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
                 }
             }   
        }
    }
    ll qry(ll ql, ll qr){
        ll rng=lg[qr-ql+1];
        return min(st[ql][rng],st[qr-(1<<rng)+1][rng]);
    }
}st;
stack<pair<ll,ll> >s;
pair<ll,ll>jmp[300005][21];
ll psum[300005],arr[300005],a[300005],c[300005];
ll n,d;
ll qry(ll ql, ll qr){
    ll ans=0;
    ll redu=a[ql];
    ll real=c[ql]%d;
    ll add=redu-real;
    ll mini=st.qry(ql,qr)+add;
    // cout<<st.qry(ql,qr)<<' ';
    if(mini<0)return -1;
    for(int i=20;i>=0;i--){
        if(jmp[qr][i].first>=ql){
            ans+=jmp[qr][i].second;
            qr=jmp[qr][i].first;
        }
    }
    ans+=(psum[qr]-psum[ql-1]-(qr-ql+1)*arr[qr])/d;
    return ans;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>d;
    for(int i=2;i<=300000;i*=2)lg[i]=1;
    for(int i=3;i<=300000;i++)lg[i]+=lg[i-1];
    for(int i=1;i<=n;i++){
       cin>>c[i];
    }
    st.init(n);
    for(int i=1;i<=n;i++){
        ll prev=c[i-1]%d,cur=c[i]%d;
        if(cur>=prev){
            a[i]=a[i-1]+cur-prev;
        }
        else{
            a[i]=a[i-1]+cur-prev+d;
        }
    }
    for(int i=1;i<=n;i++){
        arr[i]=c[i]-a[i];
        // cout<<arr[i]<<" ";
        psum[i]=psum[i-1]+arr[i];
        st.arr[i]=arr[i];
    }
    st.build(n);
    for(int i=n;i>=1;i--){
        while(s.size()){
            if(arr[i]<s.top().first){
                jmp[s.top().second][0]={i,(psum[s.top().second]-psum[i]-s.top().first*(s.top().second-i))/d};
                s.pop();
            }
            else{
                break;
            }
        }
        s.push({arr[i],i});
    }
    for(int j=1;j<=20;j++){
        for(int i=1;i<=n;i++){
            ll nxt=jmp[i][j-1].first;
            jmp[i][j]={jmp[nxt][j-1].first,jmp[i][j-1].second+jmp[nxt][j-1].second};
        }
    }
    ll q;
    cin>>q;
    while(q--){
        ll l,r;
        cin>>l>>r;
        cout<<qry(l,r)<<'\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...