제출 #1352708

#제출 시각아이디문제언어결과실행 시간메모리
1352708bakhtiyarnSum Zero (RMI20_sumzero)C++20
61 / 100
289 ms72648 KiB
// GPT'S code
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 400000 + 5;
const int LOG = 20;

int n, q;
ll c[MAXN];
ll p[MAXN];                  // prefix sums
int pre[MAXN];               // previous occurrence
int nxt[MAXN];               // next jump
int up[LOG][MAXN];           // binary lifting

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

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

    // prefix sums
    p[0] = 0;
    for (int i = 1; i <= n; i++) p[i] = p[i-1] + c[i];

    // compute pre[i]
    unordered_map<ll, int> last;
    last.reserve(n * 2);
    last.max_load_factor(0.7);

    for (int i = 0; i <= n; i++) {
        if (last.count(p[i])) pre[i] = last[p[i]];
        else pre[i] = -1;
        last[p[i]] = i;
    }

    // bucket by pre[i]
    vector<vector<int>> bucket(n + 1);
    for (int i = 0; i <= n; i++) {
        if (pre[i] >= 0)
            bucket[pre[i]].push_back(i);
    }

    // build nxt using min-heap
    priority_queue<int, vector<int>, greater<int>> pq;

    for (int i = n; i >= 0; i--) {
        for (int y : bucket[i]) {
            pq.push(y);
        }
        if (!pq.empty()) nxt[i] = pq.top();
        else nxt[i] = n + 1; // invalid
    }

    // binary lifting
    for (int i = 0; i <= n; i++) up[0][i] = nxt[i];
    for (int k = 1; k < LOG; k++) {
        for (int i = 0; i <= n; i++) {
            if (up[k-1][i] <= n)
                up[k][i] = up[k-1][ up[k-1][i] ];
            else
                up[k][i] = n + 1;
        }
    }

    cin >> q;
    while (q--) {
        int L, R;
        cin >> L >> R;

        int cur = L - 1;
        int ans = 0;

        for (int k = LOG - 1; k >= 0; k--) {
            if (up[k][cur] <= R) {
                ans += (1 << k);
                cur = up[k][cur];
            }
        }

        cout << ans << '\n';
    }

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