Submission #163711

# Submission time Handle Problem Language Result Execution time Memory
163711 2019-11-14T18:34:15 Z dolphingarlic Regions (IOI09_regions) C++14
85 / 100
8000 ms 72608 KB
#include <bits/stdc++.h>
#pragma GCC Optimize("O3")
#pragma GCC Optimize("unroll-loops")
#pragma GCC target("sse4,avx2,fma,avx")
#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[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("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 9 ms 9592 KB Output is correct
2 Correct 10 ms 9592 KB Output is correct
3 Correct 11 ms 9592 KB Output is correct
4 Correct 17 ms 9596 KB Output is correct
5 Correct 14 ms 9464 KB Output is correct
6 Correct 32 ms 9592 KB Output is correct
7 Correct 41 ms 9592 KB Output is correct
8 Correct 42 ms 9720 KB Output is correct
9 Correct 66 ms 10232 KB Output is correct
10 Correct 76 ms 10104 KB Output is correct
11 Correct 138 ms 10488 KB Output is correct
12 Correct 157 ms 11128 KB Output is correct
13 Correct 189 ms 10744 KB Output is correct
14 Correct 215 ms 11388 KB Output is correct
15 Correct 280 ms 15228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 979 ms 15836 KB Output is correct
2 Correct 1282 ms 14288 KB Output is correct
3 Correct 2004 ms 18324 KB Output is correct
4 Correct 338 ms 11432 KB Output is correct
5 Correct 523 ms 13816 KB Output is correct
6 Correct 918 ms 12664 KB Output is correct
7 Correct 1236 ms 13912 KB Output is correct
8 Correct 1266 ms 20728 KB Output is correct
9 Correct 2068 ms 20728 KB Output is correct
10 Correct 2800 ms 26868 KB Output is correct
11 Correct 3163 ms 19824 KB Output is correct
12 Correct 4370 ms 44676 KB Output is correct
13 Correct 5019 ms 45052 KB Output is correct
14 Execution timed out 8036 ms 51892 KB Time limit exceeded
15 Execution timed out 8032 ms 63884 KB Time limit exceeded
16 Correct 7139 ms 72608 KB Output is correct
17 Execution timed out 8042 ms 65284 KB Time limit exceeded