제출 #1343040

#제출 시각아이디문제언어결과실행 시간메모리
1343040po_rag526Sum Zero (RMI20_sumzero)C++20
100 / 100
709 ms20892 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll int
const ll val=400;
ll n,q,l,r,nxt[400005],nxtcan[400005],pw[30];
map<long long,long long>mp;
long long c[400005];
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cin.tie(0);
    cin>>n;
    pw[0]=1;
    nxt[n+1]=n+1;
    for(int i=1;i<=18;i++){
        pw[i]=pw[i-1]*2;
    }
    for(int i=1;i<=n;i++){
        cin>>c[i];
        c[i]+=c[i-1];
        if (mp[c[i]]!=0)nxt[mp[c[i]]]=i;
        if (c[i]==0 && mp[c[i]]==0)nxt[0]=i;
        mp[c[i]]=i;
    }
    for(int i=0;i<=n;i++){
        if (nxt[i]==0)nxt[i]=n+1;
    }
    for(int i=n-1;i>=0;i--){
        nxt[i]=min(nxt[i],nxt[i+1]);
    }
    nxtcan[n+1]=n+1;
    for(int i=0;i<=n;i++){
        if (i>0 && nxt[i]==nxt[i-1]){
            nxtcan[i]=nxtcan[i-1];
            continue;
        }
        ll cur=i;
        for(int j=1;j<=50;j++){
            cur=nxt[cur];
            if (cur==n+1)break;
        }
        nxtcan[i]=cur;
    }
    for(int i=0;i<=n;i++){
      nxtcan[i]=nxtcan[nxtcan[nxtcan[nxtcan[nxtcan[nxtcan[nxtcan[nxtcan[i]]]]]]]];
    }
    cin>>q;
    for(int query=1;query<=q;query++){
        cin>>l>>r;
        ll cur=l-1;
        ll res=0;
        while(true){
            if (nxtcan[cur]<=r){
                res+=val;
                cur=nxtcan[cur];
            }
            else break;
        }
        while(true){
            if (nxt[cur]<=r){
                res++;
                cur=nxt[cur];
            }
            else break;
        }
        cout<<res<<'\n';
    }
}
//
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...