제출 #872217

#제출 시각아이디문제언어결과실행 시간메모리
872217vjudge1Ball Machine (BOI13_ballmachine)C++17
40.24 / 100
1054 ms131072 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int N = 1e5 + 7, SQ = 320; int n, q, s, t, root, h[N], st[N], sz[N], mn[N], indx[N], it[N]; pii tree[N]; vector<int> ad[N]; set<pii> ver, one[N], sq[SQ]; void input() { cin >> n >> q; for (int i = 0; i < n; i++) { int p; cin >> p; p--; if (p > -1) ad[p].push_back(i); else root = i; } } void dfs(int v) { sz[v] = 1; mn[v] = v; st[v] = s++; for (int u: ad[v]) { h[u] = h[v] + 1; dfs(u); mn[v] = min(mn[v], mn[u]); sz[v] += sz[u]; } } bool cmp(int u, int v) { return mn[u] < mn[v]; } void forSort() { for (int i = 0; i < n; i++) sort(ad[i].begin(), ad[i].end(), cmp); for (int i = 0; i < n; i++) tree[i] = {st[i], i}; sort(tree, tree + n); for (int i = 0; i < n; i++) it[tree[i].second] = i; } void dfs2(int v) { for (int u: ad[v]) dfs2(u); indx[v] = t++; } void addTo(int v) { for (int i = it[v]; i < it[v] + sz[v]; i++) if (i % SQ || i + SQ > it[v] + sz[v]) one[i].insert({h[v], v}); else { sq[i / SQ].insert({h[v], v}); i += SQ - 1; } } void toErase(int v) { for (int i = it[v]; i < it[v] + sz[v]; i++) if (i % SQ || i + SQ > it[v] + sz[v]) one[i].erase({h[v], v}); else { sq[i / SQ].erase({h[v], v}); i += SQ - 1; } } void add(int x) { while (x--) { pii p = *ver.begin(); addTo(p.second); ver.erase(ver.begin()); if (x == 0) cout << p.second + 1 << '\n'; } } void output(int v) { int p, hi = INT_MAX, i = it[v]; if (sq[i / SQ].empty() && one[i].empty()) while (true) ; if (one[i].size()) { p = (*one[i].begin()).second; hi = h[(*one[i].begin()).second]; } if (sq[i / SQ].size() && h[(*sq[i / SQ].begin()).second] < hi) p = (*sq[i / SQ].begin()).second; cout << h[v] - h[p] << '\n'; ver.insert({indx[p], p}); toErase(p); } int main() { ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0); input(); dfs(root); forSort(); dfs2(root); for (int i = 0; i < n; i++) ver.insert({indx[i], i}); while (q--) { int t, v; cin >> t >> v; if (t == 1) add(v); else { v--; output(v); } } }

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

ballmachine.cpp: In function 'void output(int)':
ballmachine.cpp:98:20: warning: 'p' may be used uninitialized in this function [-Wmaybe-uninitialized]
   98 |  cout << h[v] - h[p] << '\n';
      |                 ~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...