제출 #1225699

#제출 시각아이디문제언어결과실행 시간메모리
1225699Ghulam_JunaidSum Zero (RMI20_sumzero)C++20
100 / 100
666 ms21328 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 4e5 + 5, LG = 12, C = 5; int n, q, last[N], par[N][2], store[N][C]; ll sm; vector<pair<ll, int>> vec; int i, j, x; int jump, l, r, cur, ans, nxt; bool cmp(pair<ll, int> &a, pair<ll, int> &b){ return (a.second < b.second); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); memset(last, -1, sizeof last); cin >> n; for (i = 1; i <= n + 2; i ++) par[i][0] = n + 2; vec.resize(n + 1); vec[0] = {sm, 0}; for (i = 1, x; i <= n; i ++){ cin >> x; sm += x; vec[i] = {sm, i}; } sort(vec.begin(), vec.end()); for (i = 0, r, j; i <= n; i ++){ r = i; while (r <= n and vec[r].first == vec[i].first) r++; for (j = i; j < r; j ++) vec[j].first = i; i = r - 1; } sort(vec.begin(), vec.end(), cmp); last[vec[0].first] = 0; for (i = 1; i <= n; i ++){ if (last[vec[i].first] != -1) par[last[vec[i].first] + 1][0] = i + 1; last[vec[i].first] = i; } for (i = n; i > 0; i --) par[i][0] = min(par[i][0], par[i + 1][0]); for (i = 1; i <= n + 2; i ++) store[i][0] = par[i][0]; for (j = 1, i; j < LG; j ++){ for (i = 1; i <= n + 2; i ++){ par[i][1] = par[par[i][0]][0]; par[i][0] = par[i][1]; if (j < C) store[i][j] = par[i][1]; } } cin >> q; while (q--){ l, r; cin >> l >> r; cur = l, ans = 0; for (jump = LG - 1; jump >= 0; jump --){ if (jump != LG - 1 and jump >= C) continue; if (jump == LG - 1) nxt = par[cur][1]; else nxt = store[cur][jump]; if (nxt <= r + 1){ cur = nxt; ans += (1 << jump); if (jump == LG - 1 or jump == C - 1) jump++; } } cout << ans << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...