# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
162866 | 2019-11-10T07:11:00 Z | dolphingarlic | Regions (IOI09_regions) | C++14 | 8000 ms | 76344 KB |
#include <bits/stdc++.h> #pragma GCC Optimize("O3") #pragma GCC Optimize("unroll-loops") #pragma GCC target ("sse4") #define FOR(i, x, y) for (int i = x; i < y; i++) using namespace std; const int c = 400; struct Node { int id, region, low, high; vector<int> children; }; struct Region { vector<int> ids; vector<pair<int, int>> ranges; int depth; }; Node nodes[200001]; Region regions[25001]; int ans1[c][25001], ans2[25001][c], maps_to[25001]; void dfs(int node, int& id_pool) { int id = id_pool++; int r = nodes[node].region; regions[r].ids.push_back(id); regions[r].depth++; regions[r].ranges.push_back({id_pool, regions[r].depth}); for (int i : nodes[node].children) dfs(i, id_pool); regions[r].depth--; regions[r].ranges.push_back({id_pool, regions[r].depth}); } inline int query(Region a, Region b) { if (a.ranges.empty()) return 0; int ans = 0; vector<int>::iterator id = b.ids.begin(); while (id != b.ids.end() && *id < a.ranges[0].first) id++; for (int i = 0; i < a.ranges.size() - 1 && id != b.ids.end(); i++) { int pos2 = a.ranges[i + 1].first, depth = a.ranges[i].second; vector<int>::iterator old = id; while (id != b.ids.end() && *id < pos2) id++; ans += depth * (id - old); } return ans; } int main() { int n, r, q; scanf("%d %d %d", &n, &r, &q); scanf("%d", &nodes[1].region); FOR(i, 2, n + 1) { int p; scanf("%d %d", &p, &nodes[i].region); nodes[p].children.push_back(i); } int id_pool = 1; dfs(1, id_pool); int cnt = 1; FOR(i, 1, r + 1) { if (regions[i].ids.size() > c) { FOR(j, 1, r + 1) { ans1[cnt][j] = query(regions[i], regions[j]); ans2[j][cnt] = query(regions[j], regions[i]); } maps_to[i] = cnt++; } } while (q--) { int a, b; scanf("%d %d", &a, &b); if (regions[a].ids.size() > c) printf("%d\n", ans1[maps_to[a]][b]); else if (regions[b].ids.size() > c) printf("%d\n", ans2[a][maps_to[b]]); else printf("%d\n", query(regions[a], regions[b])); fflush(stdout); } return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 10 ms | 9464 KB | Output is correct |
2 | Correct | 11 ms | 9592 KB | Output is correct |
3 | Correct | 13 ms | 9464 KB | Output is correct |
4 | Correct | 16 ms | 9512 KB | Output is correct |
5 | Correct | 20 ms | 9464 KB | Output is correct |
6 | Correct | 26 ms | 9592 KB | Output is correct |
7 | Correct | 40 ms | 9720 KB | Output is correct |
8 | Correct | 27 ms | 9556 KB | Output is correct |
9 | Correct | 64 ms | 10232 KB | Output is correct |
10 | Correct | 68 ms | 10104 KB | Output is correct |
11 | Correct | 97 ms | 10424 KB | Output is correct |
12 | Correct | 147 ms | 11128 KB | Output is correct |
13 | Correct | 145 ms | 10808 KB | Output is correct |
14 | Correct | 242 ms | 11384 KB | Output is correct |
15 | Correct | 273 ms | 15228 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1149 ms | 15812 KB | Output is correct |
2 | Correct | 1133 ms | 14292 KB | Output is correct |
3 | Correct | 1967 ms | 18448 KB | Output is correct |
4 | Correct | 181 ms | 11492 KB | Output is correct |
5 | Correct | 491 ms | 13804 KB | Output is correct |
6 | Correct | 2192 ms | 25644 KB | Output is correct |
7 | Correct | 2241 ms | 30836 KB | Output is correct |
8 | Correct | 4757 ms | 40792 KB | Output is correct |
9 | Correct | 1990 ms | 20700 KB | Output is correct |
10 | Execution timed out | 8039 ms | 75136 KB | Time limit exceeded |
11 | Correct | 3026 ms | 19824 KB | Output is correct |
12 | Correct | 4570 ms | 46736 KB | Output is correct |
13 | Correct | 4922 ms | 47380 KB | Output is correct |
14 | Execution timed out | 8048 ms | 54732 KB | Time limit exceeded |
15 | Execution timed out | 8026 ms | 67376 KB | Time limit exceeded |
16 | Correct | 6952 ms | 76344 KB | Output is correct |
17 | Execution timed out | 8035 ms | 68572 KB | Time limit exceeded |