제출 #1137928

#제출 시각아이디문제언어결과실행 시간메모리
1137928SyedSohaib_123Sum Zero (RMI20_sumzero)C++20
61 / 100
879 ms68988 KiB
#include <bits/stdc++.h>

using namespace std;

#define append push_back
#define int long long

const int N=4e5+10,LG=17;
int mod=998244353;

int a[N],dp[N][LG];

void solve(int tst) {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        a[i] += a[i-1];
    }
    map<int,int> last;
    for(int j=0;j<=n+2;j++) for(int i=0;i<LG;i++) dp[j][i]=n+1;
    for(int i = n; i >= 1; i--) {
        last[a[i]] = i;
        if (last.count(a[i-1])){
            dp[i][0] = min(dp[i+1][0],last[a[i-1]]);
        } else {
            dp[i][0] = (i == n ? n + 1 : dp[i+1][0]);
        }
        for(int j = 1; j < LG; j++) {
            dp[i][j] = (dp[i][j-1] == n + 1 ? n + 1 : dp[dp[i][j-1] + 1][j-1]);
            if(!dp[i][j]) dp[i][j]=n+1;
        }
    }
    int q;
    cin >> q;
    while(q--) {
        int l, r;
        cin >> l >> r;
        int ans = 0;
        for(int i = LG - 1; i >= 0; i--) {
            if(l>r) break;
            if (dp[l][i] <= r && dp[l][i] != 0) {
                ans += (1 << i);
                l = dp[l][i] + 1;
            }
        }
        cout << ans << endl;
    }
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int i = 0; i < t; i++) {
        solve(i);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...