제출 #1279726

#제출 시각아이디문제언어결과실행 시간메모리
1279726rayan_bdSum Zero (RMI20_sumzero)C++20
61 / 100
135 ms73284 KiB
#include <bits/stdc++.h>
using namespace std;
const int mxN = 4e5 + 1;
const int mxB = 19;

#define int long long

int a[mxN], dp[mxN][mxB];

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);

    int n, l, r, q;
    cin >> n;

    for(int i = 1; i <= n; ++i) cin >> a[i];

    cin >> q;

    map<int, int> mp;

    mp[0] = n + 1;

    // 0 1 2 -3 100
    //

    dp[n + 1][0] = n + 5;

    for(int i = n, sum = 0; i >= 1; --i){
        sum += a[i];
        if(mp.count(sum)){
            dp[i][0] = min(dp[i + 1][0], mp[sum]);
        }else{
            dp[i][0] = dp[i + 1][0];
        }
        mp[sum] = i;
    }

    for (int j = 1; j < mxB; j++) {
        for (int i = 1; i <= n; i++) {
            dp[i][j] = dp[dp[i][j - 1]][j - 1];
        }
    }


    while (q--) {
        cin >> l >> r;
        int ans = 0;
        for (int j = mxB - 1; j >= 0; j--) {
            if (dp[l][j] <= (r + 1) && dp[l][j] > l) {
                l = dp[l][j];
                ans += (1 << j);
            }
        }
        cout << ans << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...