제출 #636463

#제출 시각아이디문제언어결과실행 시간메모리
636463danikoynovSum Zero (RMI20_sumzero)C++14
0 / 100
1078 ms9940 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; const int maxn = 4e5 + 10; int n, q; ll pref[maxn]; int sub[maxn], lvl[maxn], heavy[maxn], ch_head[maxn], par[maxn], ch_idx[maxn]; vector < int > g[maxn], ch; void dfs(int v) { heavy[v] = -1; sub[v] = 1; for (int u : g[v]) { lvl[u] = lvl[v] + 1; par[u] = v; dfs(u); sub[v] += sub[u]; if (heavy[v] == -1 || sub[u] > sub[heavy[v]]) heavy[v] = u; } } int nxt[maxn]; void hld(int v, int tp) { ch_idx[v] = ch.size(); ch.push_back(v); ch_head[v] = tp; if (heavy[v] != -1) { hld(heavy[v], tp); } for (int u : g[v]) { if (u == heavy[v]) continue; hld(u, u); } } pair < ll, int > pr[maxn]; void solve() { cin >> n; ll x; for (int i = 1; i <= n; i ++) { cin >> x; pref[i] = pref[i - 1] + x; } for (int i = 0; i <= n; i ++) pr[i] = {pref[i], i}; sort(pr, pr + n + 1); for (int i = 0; i <= n; i ++) nxt[i] = n + 1; for (int i = 0; i < n - 1; i ++) if (pr[i].first == pr[i + 1].first) nxt[pr[i].second] = pr[i + 1].second; for (int i = 0; i <= n; i ++) cout << pr[i].first << " : " << pr[i].second << endl; /**for (int i = 0; i <= n; i ++) cout << nxt[i] << " "; cout << endl; for (int i = 0; i <= n; i ++) cout << pref[i] << " "; cout << endl;*/ map < ll, int > last; int cl = n + 1, cl2 = n + 1; for (int i = n; i >= 0; i --) { if (last[pref[i]] != 0) { cl = min(cl, last[pref[i]]); if (last[pref[i]] != nxt[i]) while(true); } cl2 = min(cl2, nxt[i]); g[cl].push_back(i); last[pref[i]] = i; } if (n > 3e5) return; dfs(n + 1); hld(n + 1, n + 1); cin >> q; int l, r, v, lf, rf, mf; for (int i = 1; i <= q; i ++) { cin >> l >> r; v = l - 1; while(ch_head[v] <= r) v = par[ch_head[v]]; rf = ch_idx[v], lf = ch_idx[ch_head[v]]; while(lf <= rf) { mf = (lf + rf) / 2; if (ch[mf] > r) lf = mf + 1; else rf = mf - 1; } cout << lvl[l - 1] - lvl[ch[rf]] - 1 << endl; } } void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } int main() { speed(); ///freopen("input.txt", "r", stdin); solve(); return 0; } /** */

컴파일 시 표준 에러 (stderr) 메시지

sumzero.cpp: In function 'void solve()':
sumzero.cpp:65:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   65 |     for (int i = 0; i < n - 1; i ++)
      |     ^~~
sumzero.cpp:69:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   69 |         for (int i = 0; i <= n; i ++)
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...