# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
444924 | 2021-07-15T21:06:41 Z | aryan12 | Ball Machine (BOI13_ballmachine) | C++17 | 244 ms | 40596 KB |
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1e5 + 5; vector<int> g[N]; int parent[N], minInSubtree[N]; int ranking[N], cnt = 1; int revRanking[N]; bool isThereBoulder[N]; int DP[20][N]; void dfs(int node) { minInSubtree[node] = node; for(int i = 0; i < g[node].size(); i++) { dfs(g[node][i]); minInSubtree[node] = min(minInSubtree[node], minInSubtree[g[node][i]]); } } void dfs2(int node) { int pos, minVal = INT_MAX; vector<pair<int, int> > temp; for(int i = 0; i < g[node].size(); i++) { temp.push_back({minInSubtree[g[node][i]], i}); } sort(temp.begin(), temp.end()); for(int i = 0; i < temp.size(); i++) { dfs2(g[node][temp[i].second]); } ranking[node] = cnt++; } void ComputeDP(int n) { for(int i = 1; i < 20; i++) { for(int j = 1; j <= n; j++) { if(DP[i - 1][j] == -1) DP[i][j] = -1; else DP[i][j] = DP[i - 1][DP[i - 1][j]]; } } } void Solve() { for(int i = 0; i < N; i++) { isThereBoulder[i] = false; } int n, q; cin >> n >> q; int root; for(int i = 1; i <= n; i++) { cin >> parent[i]; DP[0][i] = parent[i]; if(parent[i] == 0) { root = i; DP[0][i] = -1; } else { g[parent[i]].push_back(i); } } ComputeDP(n); dfs(root); dfs2(root); for(int i = 1; i <= n; i++) { //cout << ranking[i] << " "; revRanking[ranking[i]] = i; } //cout << "\n"; priority_queue<int, vector<int>, greater<int> > pq; for(int i = 1; i <= n; i++) { pq.push(ranking[i]); } vector<int> ans; for(int i = 1; i <= q; i++) { int type; cin >> type; if(type == 1) { int boulders; cin >> boulders; while(boulders != 0) { boulders--; int curRank = pq.top(); pq.pop(); isThereBoulder[revRanking[curRank]] = true; if(boulders == 0) { ans.push_back(revRanking[curRank]); } } } else { int crushedNode, res = 0; cin >> crushedNode; for(int j = 19; j >= 0; j--) { if(DP[j][crushedNode] != -1 && isThereBoulder[DP[j][crushedNode]]) { crushedNode = DP[j][crushedNode]; res += (1 << j); } } isThereBoulder[crushedNode] = false; pq.push(ranking[crushedNode]); ans.push_back(res); } } for(int i = 0; i < ans.size(); i++) { cout << ans[i] << "\n"; } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; while(t--) { Solve(); } }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 2 ms | 2892 KB | Output is correct |
2 | Correct | 147 ms | 18992 KB | Output is correct |
3 | Correct | 62 ms | 19000 KB | Output is correct |
4 | Correct | 2 ms | 2892 KB | Output is correct |
5 | Correct | 3 ms | 2892 KB | Output is correct |
6 | Correct | 3 ms | 3036 KB | Output is correct |
7 | Correct | 4 ms | 3020 KB | Output is correct |
8 | Correct | 4 ms | 3148 KB | Output is correct |
9 | Correct | 8 ms | 3940 KB | Output is correct |
10 | Correct | 21 ms | 6880 KB | Output is correct |
11 | Correct | 112 ms | 19148 KB | Output is correct |
12 | Correct | 74 ms | 19000 KB | Output is correct |
13 | Correct | 108 ms | 18980 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 37 ms | 10992 KB | Output is correct |
2 | Correct | 152 ms | 33544 KB | Output is correct |
3 | Correct | 106 ms | 26812 KB | Output is correct |
4 | Correct | 74 ms | 13396 KB | Output is correct |
5 | Correct | 73 ms | 13092 KB | Output is correct |
6 | Correct | 71 ms | 13180 KB | Output is correct |
7 | Correct | 63 ms | 11652 KB | Output is correct |
8 | Correct | 44 ms | 10936 KB | Output is correct |
9 | Correct | 183 ms | 34160 KB | Output is correct |
10 | Correct | 175 ms | 33636 KB | Output is correct |
11 | Correct | 139 ms | 34388 KB | Output is correct |
12 | Correct | 179 ms | 30528 KB | Output is correct |
13 | Correct | 121 ms | 36804 KB | Output is correct |
14 | Correct | 92 ms | 26816 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 76 ms | 18548 KB | Output is correct |
2 | Correct | 186 ms | 30776 KB | Output is correct |
3 | Correct | 176 ms | 32808 KB | Output is correct |
4 | Correct | 135 ms | 27296 KB | Output is correct |
5 | Correct | 176 ms | 27408 KB | Output is correct |
6 | Correct | 112 ms | 27564 KB | Output is correct |
7 | Correct | 121 ms | 24792 KB | Output is correct |
8 | Correct | 157 ms | 32828 KB | Output is correct |
9 | Correct | 185 ms | 34372 KB | Output is correct |
10 | Correct | 197 ms | 34508 KB | Output is correct |
11 | Correct | 184 ms | 33724 KB | Output is correct |
12 | Correct | 194 ms | 30684 KB | Output is correct |
13 | Correct | 244 ms | 40596 KB | Output is correct |
14 | Correct | 127 ms | 27252 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 193 ms | 34468 KB | Output is correct |
2 | Correct | 197 ms | 30688 KB | Output is correct |
3 | Correct | 112 ms | 40272 KB | Output is correct |
4 | Correct | 217 ms | 34380 KB | Output is correct |
5 | Correct | 207 ms | 33920 KB | Output is correct |
6 | Correct | 149 ms | 34528 KB | Output is correct |
7 | Correct | 232 ms | 30684 KB | Output is correct |
8 | Correct | 144 ms | 40264 KB | Output is correct |
9 | Correct | 82 ms | 26792 KB | Output is correct |