1+ package class183 ;
2+
3+ // 消息传递,C++版
4+ // 一共有n个节点,给定n-1条边,所有节点组成一棵树
5+ // 如果x号节点收到一个消息,那么消息会从x开始扩散,速度为每天越过一条边
6+ // 接下来有m条查询,每条查询都是相互独立的,格式如下
7+ // 查询 x k : 第0天的时候,x号节点得到一条信息,打印第k天时,新收到该消息的人数
8+ // 1 <= n、m <= 10^5
9+ // 0 <= k < n
10+ // 测试链接 : https://www.luogu.com.cn/problem/P6626
11+ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样
12+ // 提交如下代码,可以通过所有测试用例
13+
14+ //#include <bits/stdc++.h>
15+ //
16+ //using namespace std;
17+ //
18+ //struct Node {
19+ // int tim, qid;
20+ //};
21+ //
22+ //const int MAXN = 100001;
23+ //int t, n, m;
24+ //
25+ //int headg[MAXN];
26+ //int nextg[MAXN << 1];
27+ //int tog[MAXN << 1];
28+ //int cntg;
29+ //
30+ //int headq[MAXN];
31+ //int nextq[MAXN];
32+ //int tim[MAXN];
33+ //int qid[MAXN];
34+ //int cntq;
35+ //
36+ //bool vis[MAXN];
37+ //int siz[MAXN];
38+ //int maxPart[MAXN];
39+ //int total;
40+ //int centroid;
41+ //
42+ //int depCnt[MAXN];
43+ //int maxDep;
44+ //
45+ //Node arr[MAXN];
46+ //int cnta;
47+ //
48+ //int ans[MAXN];
49+ //
50+ //void addEdge(int u, int v) {
51+ // nextg[++cntg] = headg[u];
52+ // tog[cntg] = v;
53+ // headg[u] = cntg;
54+ //}
55+ //
56+ //void addQuery(int u, int t, int id) {
57+ // nextq[++cntq] = headq[u];
58+ // tim[cntq] = t;
59+ // qid[cntq] = id;
60+ // headq[u] = cntq;
61+ //}
62+ //
63+ //void getCentroid(int u, int fa) {
64+ // siz[u] = 1;
65+ // maxPart[u] = 0;
66+ // for (int e = headg[u]; e; e = nextg[e]) {
67+ // int v = tog[e];
68+ // if (v != fa && !vis[v]) {
69+ // getCentroid(v, u);
70+ // siz[u] += siz[v];
71+ // maxPart[u] = max(maxPart[u], siz[v]);
72+ // }
73+ // }
74+ // maxPart[u] = max(maxPart[u], total - siz[u]);
75+ // if (centroid == 0 || maxPart[u] < maxPart[centroid]) {
76+ // centroid = u;
77+ // }
78+ //}
79+ //
80+ //void dfs(int u, int fa, int dep) {
81+ // depCnt[dep]++;
82+ // maxDep = max(maxDep, dep);
83+ // for (int e = headq[u]; e; e = nextq[e]) {
84+ // if (tim[e] + 1 >= dep) {
85+ // arr[++cnta] = { tim[e] - dep + 2, qid[e] };
86+ // }
87+ // }
88+ // for (int e = headg[u]; e; e = nextg[e]) {
89+ // int v = tog[e];
90+ // if (v != fa && !vis[v]) {
91+ // dfs(v, u, dep + 1);
92+ // }
93+ // }
94+ //}
95+ //
96+ //void calc(int u) {
97+ // cnta = 0;
98+ // maxDep = 0;
99+ // dfs(u, 0, 1);
100+ // for (int i = 1; i <= cnta; i++) {
101+ // ans[arr[i].qid] += depCnt[arr[i].tim];
102+ // }
103+ // for (int d = 1; d <= maxDep; d++) {
104+ // depCnt[d] = 0;
105+ // }
106+ // for (int e = headg[u]; e; e = nextg[e]) {
107+ // int v = tog[e];
108+ // if (!vis[v]) {
109+ // cnta = 0;
110+ // maxDep = 0;
111+ // dfs(v, u, 2);
112+ // for (int i = 1; i <= cnta; i++) {
113+ // ans[arr[i].qid] -= depCnt[arr[i].tim];
114+ // }
115+ // for (int d = 1; d <= maxDep; d++) {
116+ // depCnt[d] = 0;
117+ // }
118+ // }
119+ // }
120+ //}
121+ //
122+ //void solve(int u) {
123+ // vis[u] = true;
124+ // calc(u);
125+ // for (int e = headg[u]; e; e = nextg[e]) {
126+ // int v = tog[e];
127+ // if (!vis[v]) {
128+ // total = siz[v];
129+ // centroid = 0;
130+ // getCentroid(v, u);
131+ // solve(centroid);
132+ // }
133+ // }
134+ //}
135+ //
136+ //void prepare() {
137+ // cntg = 0;
138+ // cntq = 0;
139+ // for (int i = 1; i <= n; i++) {
140+ // headg[i] = 0;
141+ // headq[i] = 0;
142+ // vis[i] = false;
143+ // }
144+ // for (int i = 1; i <= m; i++) {
145+ // ans[i] = 0;
146+ // }
147+ //}
148+ //
149+ //int main() {
150+ // ios::sync_with_stdio(false);
151+ // cin.tie(nullptr);
152+ // cin >> t;
153+ // for (int c = 1; c <= t; c++) {
154+ // cin >> n >> m;
155+ // prepare();
156+ // for (int i = 1, u, v; i < n; i++) {
157+ // cin >> u >> v;
158+ // addEdge(u, v);
159+ // addEdge(v, u);
160+ // }
161+ // for (int i = 1, x, k; i <= m; i++) {
162+ // cin >> x >> k;
163+ // addQuery(x, k, i);
164+ // }
165+ // total = n;
166+ // centroid = 0;
167+ // getCentroid(1, 0);
168+ // solve(centroid);
169+ // for (int i = 1; i <= m; i++) {
170+ // cout << ans[i] << '\n';
171+ // }
172+ // }
173+ // return 0;
174+ //}
0 commit comments