Submission #163713

# Submission time Handle Problem Language Result Execution time Memory
163713 2019-11-14T18:39:25 Z dolphingarlic Regions (IOI09_regions) C++14
85 / 100
8000 ms 71000 KB
#include <bits/stdc++.h>
#pragma GCC Optimize("unroll-loops")
#pragma GCC target("avx,avx2")
#define FOR(i, x, y) for (int i = x; i < y; i++)
using namespace std;
 
const int c = 575;
 
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[200000 / c][25001], ans2[25001][200000 / 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

regions.cpp:2:0: warning: ignoring #pragma GCC Optimize [-Wunknown-pragmas]
 #pragma GCC Optimize("unroll-loops")
 
regions.cpp: In function 'int query(Region, Region)':
regions.cpp:43:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a.ranges.size() - 1 && id != b.ids.end(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:56:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &r, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:57:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &nodes[1].region);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:60:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &p, &nodes[i].region);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 11 ms 9720 KB Output is correct
2 Correct 11 ms 9464 KB Output is correct
3 Correct 13 ms 9596 KB Output is correct
4 Correct 15 ms 9464 KB Output is correct
5 Correct 15 ms 9464 KB Output is correct
6 Correct 34 ms 9592 KB Output is correct
7 Correct 48 ms 9720 KB Output is correct
8 Correct 47 ms 9592 KB Output is correct
9 Correct 54 ms 10232 KB Output is correct
10 Correct 108 ms 10104 KB Output is correct
11 Correct 87 ms 10360 KB Output is correct
12 Correct 166 ms 11128 KB Output is correct
13 Correct 172 ms 10744 KB Output is correct
14 Correct 233 ms 11384 KB Output is correct
15 Correct 268 ms 15096 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1180 ms 15808 KB Output is correct
2 Correct 1299 ms 14336 KB Output is correct
3 Correct 1948 ms 18360 KB Output is correct
4 Correct 333 ms 11384 KB Output is correct
5 Correct 341 ms 13688 KB Output is correct
6 Correct 919 ms 12792 KB Output is correct
7 Correct 1289 ms 13924 KB Output is correct
8 Correct 1188 ms 20856 KB Output is correct
9 Correct 1988 ms 20728 KB Output is correct
10 Correct 2849 ms 26872 KB Output is correct
11 Correct 3153 ms 19828 KB Output is correct
12 Correct 4430 ms 43528 KB Output is correct
13 Correct 4881 ms 44288 KB Output is correct
14 Execution timed out 8015 ms 50424 KB Time limit exceeded
15 Execution timed out 8018 ms 62048 KB Time limit exceeded
16 Correct 6954 ms 71000 KB Output is correct
17 Execution timed out 8025 ms 64156 KB Time limit exceeded