제출 #856008

#제출 시각아이디문제언어결과실행 시간메모리
856008mraronSum Zero (RMI20_sumzero)C++14
0 / 100
4 ms1484 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5001;
using ll = long long ;
int n;
int c[MAXN];
int q;
int qL[MAXN], qR[MAXN];
int qans[MAXN];

void solve(int L, int R, vector<int>& qs) {
    if(R<L || qs.empty()) return ;
    int mid=(L+R)/2;
    vector<int> ans(R-L+2), where(R-L+2);
    vector<ll> pref(R-L+2);
    for(int i=L;i<=R;++i) {
        pref[i-L+1]=pref[i-L]+c[i];
    }
    map<ll,int> last;
    auto handle=[&](int i) {
        ans[i]=0;
        where[i]=i;
        if(i+1<=mid) {
            if(ans[i]<ans[i+1]) {
                ans[i]=ans[i+1];
                where[i]=where[i+1];
            }
        }
        ll curr_pref=pref[i-(L-1)];
        if(last.count(curr_pref)) {
            int w=last[curr_pref];
            if(ans[i]<1+ans[w]) {
                ans[i]=1+ans[w];
                where[i]=where[w];
            }
        }
        
        last[curr_pref]=i;
    };
    for(int i=mid;i>=L-1;i--) {
        handle(i);
    }
    last.clear();
    for(int i=mid+1;i<=R;i++) {
        handle(i);
    }
    
    last.clear();
    for(int i=L-1;i<=mid;++i) {
        last[pref[i-(L-1)]]=i;
    }
    
    vector<int> best(R-(mid+1)+1);
    for(int i=mid+1;i<=R;++i) {
        int ind=i-(mid+1);
        best[ind]=-1;
        ll curr_pref=pref[i-(L-1)];
        if(last.count(curr_pref)) {
            best[ind]=last[curr_pref];
        }
        if(i>mid+1) best[ind]=max(best[ind], best[ind-1]);
    }
    
    vector<int> bal, jobb;
    for(int i:qs) {
        if(qL[i]<=mid && mid+1<=qR[i]) {
            qans[i]=ans[qL[i]-1]+ans[qR[i]];
            int leftStop=where[qL[i]-1], rightStart=where[qR[i]];
            //~ cerr<<leftStop<<" "<<rightStart<<" "<<best[rightStart-(mid+1)]<<"\n";
            if(leftStop<=best[rightStart-(mid+1)]) qans[i]++;
        }else if(qR[i]<=mid) {
            bal.push_back(i);
        }else {
            jobb.push_back(i);
        }
    }   
    
    solve(L, mid, bal);
    solve(mid+1, R, jobb);
    
    //~ for(auto i:pref) cerr<<i<<" ";cerr<<"\n";
    //~ for(auto i:ans) cerr<<i<<" ";cerr<<"\n";
    //~ for(auto i:where) cerr<<i<<" ";cerr<<"\n";
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;++i) cin>>c[i];
    cin>>q;
    for(int i=0;i<q;++i) cin>>qL[i]>>qR[i];
    
    vector<int> qs;
    for(int i=0;i<q;++i) qs.push_back(i);
    solve(1, n, qs);
    for(int i=0;i<q;++i) cout<<qans[i]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...