求助dsu寄了
查看原帖
求助dsu寄了
537324
SengRiy楼主2022/8/28 16:43
#include <iostream>
#include <vector>
#include <map>
#include <set>

using namespace std;

const int N = 1e5 + 5;

struct NODE {
  int id, a;
};

int n, siz[N], dep[N], son[N], heavy, m, ans[N];
string s[N];
vector<int> nbr[N];
vector<NODE> q[N];
set<string> qs;
map<string, int> cnt[N];

inline void dfs(int x, int fa) {
  if (x != 0) {
    siz[x] = 1;
  }
  dep[x] = dep[fa] + 1;
  for (int i = 0; i < nbr[x].size(); ++i) {
    int to = nbr[x][i];
    if (to == fa) {
      continue;
    }
    dfs(to, x);
    siz[x] += siz[to];
    if (son[x] == 0 || siz[son[x]] < siz[to]) {
      son[x] = to;
    }
  }
}

inline void update(int x, int fa, int val) {
  cnt[dep[x]][s[x]] += val;
  for (int i = 0; i < nbr[x].size(); ++i) {
    int to = nbr[x][i];
    if (to == fa || to == heavy) {
      continue;
    }
    update(to, x, val);
  }
}

inline int check(int x) {
  int sum = 0;
  for (auto it : qs) {
    sum += (cnt[x][it] > 0);
  }
  return sum;
}

inline void get_anser(int x) {
  for (int i = 0; i < q[x].size(); ++i) {
    int id = q[x][i].id, d = q[x][i].a;
    ans[id] = check(d);
  }
}

inline void dfs2(int x, int fa, int big) {
  for (int i = 0; i < nbr[x].size(); ++i) {
    int to = nbr[x][i];
    if (to == son[x] || to == fa) {
      continue;
    }
    dfs2(to, x, 0);
  }
  if (son[x]) {
    dfs2(son[x], x, 1);
    heavy = son[x];
  }
  update(x, fa, 1);
  heavy = 0;
  get_anser(x);
  if (big == 0) {
    update(x, fa, -1);
  }
} 

int main() {
  cin >> n;

  for (int i = 1; i <= n; ++i) {
    int f;
    cin >> s[i] >> f;
    qs.insert(s[i]);
    nbr[f].push_back(i);
  }
  cin >> m;

  for (int i = 1; i <= m; ++i) {
    int a, b;
    cin >> a >> b;
    q[a].push_back((NODE){i, b});
  }

  dep[0] = 0;
  for (int i = 1; i <= n; ++i) {
    for (auto it : qs) {
      cout << it << cnt[i][it] << ' ';
    }
    cout << '\n';
  }
  dfs(0, 0);
  dfs2(0, 0, 0);
  for (int i = 1; i <= m; ++i) {
    cout << ans[i] << '\n';
  }
}
2022/8/28 16:43
加载中...