Submission #162864

# Submission time Handle Problem Language Result Execution time Memory
162864 2019-11-10T07:08:44 Z dolphingarlic Regions (IOI09_regions) C++14
85 / 100
8000 ms 90860 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 = 550;

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

regions.cpp:2:0: warning: ignoring #pragma GCC Optimize [-Wunknown-pragmas]
 #pragma GCC Optimize("O3")
 
regions.cpp:3:0: warning: ignoring #pragma GCC Optimize [-Wunknown-pragmas]
 #pragma GCC Optimize("unroll-loops")
 
regions.cpp: In function 'int query(Region, Region)':
regions.cpp:44: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:57: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:58: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:61: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:81: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 9464 KB Output is correct
2 Correct 11 ms 9464 KB Output is correct
3 Correct 13 ms 9512 KB Output is correct
4 Correct 15 ms 9464 KB Output is correct
5 Correct 20 ms 9464 KB Output is correct
6 Correct 37 ms 9592 KB Output is correct
7 Correct 37 ms 9592 KB Output is correct
8 Correct 50 ms 9720 KB Output is correct
9 Correct 66 ms 10232 KB Output is correct
10 Correct 88 ms 10104 KB Output is correct
11 Correct 121 ms 10360 KB Output is correct
12 Correct 148 ms 11128 KB Output is correct
13 Correct 163 ms 10744 KB Output is correct
14 Correct 255 ms 11384 KB Output is correct
15 Correct 247 ms 15224 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1193 ms 15956 KB Output is correct
2 Correct 1110 ms 14544 KB Output is correct
3 Correct 2033 ms 18464 KB Output is correct
4 Correct 292 ms 11384 KB Output is correct
5 Correct 448 ms 13688 KB Output is correct
6 Correct 938 ms 12664 KB Output is correct
7 Correct 1242 ms 13944 KB Output is correct
8 Correct 1305 ms 20780 KB Output is correct
9 Correct 2148 ms 20728 KB Output is correct
10 Correct 2831 ms 26940 KB Output is correct
11 Correct 3328 ms 19832 KB Output is correct
12 Correct 4417 ms 56344 KB Output is correct
13 Correct 4987 ms 56796 KB Output is correct
14 Execution timed out 8036 ms 66500 KB Time limit exceeded
15 Execution timed out 8042 ms 82036 KB Time limit exceeded
16 Correct 7223 ms 90860 KB Output is correct
17 Execution timed out 8026 ms 79964 KB Time limit exceeded