# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
82817 | 2018-11-01T20:44:40 Z | farukkastamonuda | Inspection (POI11_ins) | C++14 | 2208 ms | 132096 KB |
#include <cstdio> #include <vector> #include <queue> #include <cassert> #include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN = 1000123; const int NOANS = -1; int deg[MAXN]; vector<int> v[MAXN]; int n; bool used[MAXN]; int myDeg[MAXN], father[MAXN], sizeOfSubtree[MAXN], depth[MAXN], maxSubtree[MAXN]; LL cost[MAXN]; queue<int> q; vector<int> cands; vector<int> getCandidates; void dfs(int x) { used[x] = true; for(int i = 0; i < (int)v[x].size(); i ++) if (!used[v[x][i]]) { father[v[x][i]] = x; dfs(v[x][i]); } } vector<int> getCands(int root) { for(int i = 0; i < n; i ++) { myDeg[i] = deg[i]; used[i] = false; father[i] = - 1; sizeOfSubtree[i] = 1; maxSubtree[i] = 0; } dfs(root); for(int i = 0; i < n; i ++) if (myDeg[i] == 1) { q.push(i); } while (! q.empty()) { int wz1 = q.front(); q.pop(); myDeg[father[wz1]] --; if (std::max(n - sizeOfSubtree[wz1], maxSubtree[wz1]) <= n / 2) { cands.push_back(wz1); } sizeOfSubtree[father[wz1]] += sizeOfSubtree[wz1]; maxSubtree[father[wz1]] = std::max(maxSubtree[father[wz1]], sizeOfSubtree[wz1]); if (myDeg[father[wz1]] == 1 && father[wz1] != - 1) { q.push(father[wz1]); } } return cands; } LL anal(int root) { for(int i = 0; i < n; i ++) { myDeg[i] = deg[i]; used[i] = false; father[i] = - 1; sizeOfSubtree[i] = 1; cost[i] = 0; depth[i] = 0; } dfs(root); queue<int> q; for(int i = 0; i < n; i++) if (myDeg[i] == 1) { q.push(i); } while (! q.empty()) { int wz1 = q.front(); q.pop(); myDeg[father[wz1]] --; sizeOfSubtree[father[wz1]] += sizeOfSubtree[wz1]; cost[father[wz1]] += (2L * sizeOfSubtree[wz1] + cost[wz1]); depth[father[wz1]] = std::max(depth[father[wz1]], depth[wz1] + 1); if (myDeg[father[wz1]] == 1 && father[wz1] != - 1) { q.push(father[wz1]); } } int maxDepth = 0; for(int i = 0; i < (int)v[root].size(); i ++) { maxDepth = std::max(maxDepth, depth[v[root][i]]); } for(int i = 0; i < (int)v[root].size(); i ++) { if (sizeOfSubtree[v[root][i]] == n / 2) { maxDepth = depth[v[root][i]]; } } return cost[root] - (maxDepth + 1); } int main() { int a, b; scanf("%d", &n); if (n == 1) { printf("0\n"); return 0; } for(int i = 0; i < n - 1; i ++) { scanf("%d %d", &a, &b); a --; b --; v[a].push_back(b); v[b].push_back(a); deg[a] ++; deg[b] ++; } getCandidates = getCands(n - 1); if (getCandidates.size() == 1) { int a = getCandidates[0]; for(int i = 0; i < a; i++) { printf("%d\n", NOANS); } printf("%lld\n", anal(a)); for(int i = a + 1; i < n; i++) { printf("%d\n", NOANS); } } else if (getCandidates.size() == 2) { int a = getCandidates[ 0 ], b = getCandidates[ 1 ]; if (a > b) swap(a, b); for(int i = 0; i < a; i ++) { printf("%d\n", NOANS); } printf("%lld\n", anal(a)); for(int i = a + 1; i < b; i ++) { printf("%d\n", NOANS); } printf("%lld\n", anal(b)); for(int i = b + 1; i < n; i ++) { printf("%d\n", NOANS); } } else { assert(false); } return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 24 ms | 23928 KB | Output is correct |
2 | Correct | 23 ms | 24044 KB | Output is correct |
3 | Correct | 30 ms | 24044 KB | Output is correct |
4 | Correct | 24 ms | 24044 KB | Output is correct |
5 | Correct | 23 ms | 24044 KB | Output is correct |
6 | Correct | 27 ms | 24044 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 23 ms | 24044 KB | Output is correct |
2 | Correct | 23 ms | 24112 KB | Output is correct |
3 | Correct | 27 ms | 24112 KB | Output is correct |
4 | Correct | 23 ms | 24112 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 24 ms | 24132 KB | Output is correct |
2 | Correct | 24 ms | 24260 KB | Output is correct |
3 | Correct | 27 ms | 24276 KB | Output is correct |
4 | Correct | 25 ms | 24276 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 39 ms | 25444 KB | Output is correct |
2 | Correct | 39 ms | 25700 KB | Output is correct |
3 | Correct | 39 ms | 25956 KB | Output is correct |
4 | Correct | 41 ms | 25956 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 61 ms | 26868 KB | Output is correct |
2 | Correct | 57 ms | 27252 KB | Output is correct |
3 | Correct | 56 ms | 27668 KB | Output is correct |
4 | Correct | 53 ms | 27668 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 127 ms | 31088 KB | Output is correct |
2 | Correct | 132 ms | 32176 KB | Output is correct |
3 | Correct | 138 ms | 33352 KB | Output is correct |
4 | Correct | 110 ms | 33352 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 990 ms | 59232 KB | Output is correct |
2 | Correct | 977 ms | 64568 KB | Output is correct |
3 | Correct | 941 ms | 70116 KB | Output is correct |
4 | Correct | 755 ms | 70116 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 2178 ms | 93980 KB | Output is correct |
2 | Correct | 2055 ms | 104320 KB | Output is correct |
3 | Correct | 1943 ms | 115836 KB | Output is correct |
4 | Correct | 1670 ms | 115836 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 2208 ms | 115836 KB | Output is correct |
2 | Correct | 2149 ms | 115836 KB | Output is correct |
3 | Correct | 1903 ms | 115860 KB | Output is correct |
4 | Correct | 1639 ms | 115860 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 2072 ms | 115860 KB | Output is correct |
2 | Correct | 2067 ms | 118840 KB | Output is correct |
3 | Runtime error | 1964 ms | 132096 KB | Memory limit exceeded: We have a known bug that the memory usage is measured incorrectly (possibly because of Meltdown/Spectre patch), so your solution may be correct. Please submit again. Sorry for the inconvenience. |
4 | Halted | 0 ms | 0 KB | - |