Submission #753624

#TimeUsernameProblemLanguageResultExecution timeMemory
753624CpDarkRegions (IOI09_regions)C++17
30 / 100
2277 ms131072 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<double, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<bool> vb;
typedef vector<vb> vvb;

vvi graph;
vi home;
vector<map<int, int>> mp;
map<int,map<int, int>> ans;

inline void merge(map<int, int> &a, map<int, int>&b) {
    for (auto curr : b) {
        a[curr.first] += curr.second;
    }
}

inline void update(int v) {
    for (auto curr : mp[v]) {
        ans[home[v]][curr.first] += curr.second;
    }
}

void dfs(int v, int p) {
    mp[v][home[v]]++;
    int index = v;
    int size = 1;
    for (int i = 0;i < graph[v].size();i++) {
        int u = graph[v][i];
        if (u != p) {
            dfs(u, v);
            if (mp[u].size() > size) {
                size = mp[u].size();
                index = u;
            }
        }
    }
    
    if (index != v) {
        swap(mp[v], mp[index]);
        merge(mp[v], mp[index]);
        mp[index].clear();
    }
    for (int i = 0;i < graph[v].size();i++) {
        int u = graph[v][i];
        if (u != p && u != index) {
            merge(mp[v], mp[u]);
            mp[u].clear();
        }  
    }
    
    update(v);
}

inline int query(int r1, int r2) {
    if (ans.find(r1) == ans.end() || ans[r1].find(r2) == ans[r1].end())return 0;
    return ans[r1][r2];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, r, q;
    cin >> n >> r >> q;
    home.resize(n + 1);
    graph.resize(n + 1);
    mp.resize(n + 1);
    cin >> home[1];

    int p;
    for (int i = 0;i < n - 1;i++) {
        cin >> p >> home[i + 2];
        graph[i + 2].push_back(p);
        graph[p].push_back(i + 2);
    }

    dfs(1, 1);
    int r1, r2;
    for (int i = 0;i < q;i++) {
        cin >> r1 >> r2;
        int curr = query(r1, r2);
        cout << curr << endl;
    }

    return 0;
}

Compilation message (stderr)

regions.cpp: In function 'void dfs(int, int)':
regions.cpp:36:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for (int i = 0;i < graph[v].size();i++) {
      |                    ~~^~~~~~~~~~~~~~~~~
regions.cpp:40:30: warning: comparison of integer expressions of different signedness: 'std::map<int, int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   40 |             if (mp[u].size() > size) {
      |                 ~~~~~~~~~~~~~^~~~~~
regions.cpp:52:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     for (int i = 0;i < graph[v].size();i++) {
      |                    ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...