제출 #1239069

#제출 시각아이디문제언어결과실행 시간메모리
1239069eirinayukariBall Machine (BOI13_ballmachine)C++20
100 / 100
252 ms28708 KiB
// XD XD #include <bits/stdc++.h> #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define el cout << "\n"; using namespace std; using ll = long long; const int MAXN = 1e5 + 7; const int LG = 17; const int MOD = 1e9 + 7; const int INF = 1e9 + 7; const ll LLINF = 1e18 + 7; template <typename T> bool ckmin(T& a, T b) { return a > b ? a = b, true : false; } template <typename T> bool ckmax(T& a, T b) { return a < b ? a = b, true : false; } int n, q; vector<int> adj[MAXN]; int root; int dep[MAXN], mn[MAXN]; int tim[MAXN], timer = 0; int up[LG + 1][MAXN]; bool ball[MAXN]; priority_queue<pair<int, int>> pq; void dfs1(int u) { mn[u] = u; for (int v : adj[u]) { dep[v] = dep[u] + 1; dfs1(v); ckmin(mn[u], mn[v]); } } void dfs2(int u) { vector<pair<int, int>> s; for (int v : adj[u]) { s.emplace_back(mn[v], v); } sort(all(s)); for (auto [m, v] : s) { dfs2(v); } tim[u] = ++timer; } void add(bool print) { auto [t, u] = pq.top(); pq.pop(); ball[u] = true; if (print) { cout << u << "\n"; } } void rev(int u) { int anc = u; for (int i = LG; i >= 0; i--) { int p = up[i][anc]; if (ball[p]) { anc = p; } } cout << dep[u] - dep[anc] << "\n"; ball[anc] = false; pq.emplace(-tim[anc], anc); } void solve(int id) { // cout << "Case " << id << ": "; cin >> n >> q; for (int i = 1; i <= n; i++) { int p; cin >> p; if (p) { adj[p].push_back(i); up[0][i] = p; } else { root = i; } } dfs1(root); dfs2(root); for (int i = 1; i <= LG; i++) { for (int j = 1; j <= n; j++) { up[i][j] = up[i - 1][up[i - 1][j]]; } } for (int i = 1; i <= n; i++) { pq.emplace(-tim[i], i); } // for (int i = 1; i <= n; i++) { // cout << tim[i] << " "; // } while (q--) { int opt, x; cin >> opt >> x; if (opt == 1) { for (int i = 1; i <= x; i++) { add(i == x); } } else { rev(x); } } } int main() { ios::sync_with_stdio(0); cin.tie(0); int T = 1; // cin >> T; for (int i = 1; i <= T; i++) { solve(i); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...