1+ package class183 ;
2+
3+ // 相近点对的数量,C++版
4+ // 一共有n个节点,所有节点组成一棵树,1号节点是树头
5+ // 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权
6+ // 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义
7+ // 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw
8+ // 打印树上有多少相近点对
9+ // 1 <= limitl <= n <= 10^5
10+ // 0 <= limitw <= 10^9
11+ // 0 <= 边权 <= 10^4
12+ // 测试链接 : https://www.luogu.com.cn/problem/CF293E
13+ // 测试链接 : https://codeforces.com/problemset/problem/293/E
14+ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样
15+ // 提交如下代码,可以通过所有测试用例
16+
17+ //#include <bits/stdc++.h>
18+ //
19+ //using namespace std;
20+ //
21+ //struct Node {
22+ // int dis, dep;
23+ //};
24+ //
25+ //bool NodeCmp(Node a, Node b) {
26+ // return a.dis < b.dis;
27+ //}
28+ //
29+ //const int MAXN = 100002;
30+ //int n, limitl, limitw;
31+ //
32+ //int head[MAXN];
33+ //int nxt[MAXN << 1];
34+ //int to[MAXN << 1];
35+ //int weight[MAXN << 1];
36+ //int cntg;
37+ //
38+ //bool vis[MAXN];
39+ //int siz[MAXN];
40+ //int maxPart[MAXN];
41+ //int total;
42+ //int centroid;
43+ //
44+ //Node arr[MAXN];
45+ //int cnta;
46+ //
47+ //int tree[MAXN];
48+ //
49+ //void addEdge(int u, int v, int w) {
50+ // nxt[++cntg] = head[u];
51+ // to[cntg] = v;
52+ // weight[cntg] = w;
53+ // head[u] = cntg;
54+ //}
55+ //
56+ //int lowbit(int i) {
57+ // return i & -i;
58+ //}
59+ //
60+ //void add(int i, int v) {
61+ // while (i <= limitl + 1) {
62+ // tree[i] += v;
63+ // i += lowbit(i);
64+ // }
65+ //}
66+ //
67+ //int sum(int i) {
68+ // int ret = 0;
69+ // while (i > 0) {
70+ // ret += tree[i];
71+ // i -= lowbit(i);
72+ // }
73+ // return ret;
74+ //}
75+ //
76+ //void getCentroid(int u, int fa) {
77+ // siz[u] = 1;
78+ // maxPart[u] = 0;
79+ // for (int e = head[u]; e; e = nxt[e]) {
80+ // int v = to[e];
81+ // if (v != fa && !vis[v]) {
82+ // getCentroid(v, u);
83+ // siz[u] += siz[v];
84+ // maxPart[u] = max(maxPart[u], siz[v]);
85+ // }
86+ // }
87+ // maxPart[u] = max(maxPart[u], total - siz[u]);
88+ // if (centroid == 0 || maxPart[u] < maxPart[centroid]) {
89+ // centroid = u;
90+ // }
91+ //}
92+ //
93+ //void dfs(int u, int fa, int dis, int dep) {
94+ // if (dis > limitw || dep > limitl + 1) {
95+ // return;
96+ // }
97+ // arr[++cnta] = { dis, dep };
98+ // for (int e = head[u]; e; e = nxt[e]) {
99+ // int v = to[e];
100+ // if (v != fa && !vis[v]) {
101+ // dfs(v, u, dis + weight[e], dep + 1);
102+ // }
103+ // }
104+ //}
105+ //
106+ //long long calc(int u, int dis, int dep) {
107+ // cnta = 0;
108+ // dfs(u, 0, dis, dep);
109+ // sort(arr + 1, arr + cnta + 1, NodeCmp);
110+ // for (int i = 1; i <= cnta; i++) {
111+ // add(arr[i].dep, 1);
112+ // }
113+ // long long ret = 0;
114+ // for (int l = 1, r = cnta; l <= r; ) {
115+ // if (arr[l].dis + arr[r].dis <= limitw) {
116+ // add(arr[l].dep, -1);
117+ // ret += sum(limitl - arr[l].dep + 2);
118+ // l++;
119+ // } else {
120+ // add(arr[r].dep, -1);
121+ // r--;
122+ // }
123+ // }
124+ // return ret;
125+ //}
126+ //
127+ //long long solve(int u) {
128+ // vis[u] = true;
129+ // long long ans = calc(u, 0, 1);
130+ // for (int e = head[u]; e; e = nxt[e]) {
131+ // int v = to[e];
132+ // if (!vis[v]) {
133+ // ans -= calc(v, weight[e], 2);
134+ // total = siz[v];
135+ // centroid = 0;
136+ // getCentroid(v, 0);
137+ // ans += solve(centroid);
138+ // }
139+ // }
140+ // return ans;
141+ //}
142+ //
143+ //int main() {
144+ // ios::sync_with_stdio(false);
145+ // cin.tie(nullptr);
146+ // cin >> n >> limitl >> limitw;
147+ // for (int i = 2, fa, w; i <= n; i++) {
148+ // cin >> fa >> w;
149+ // addEdge(i, fa, w);
150+ // addEdge(fa, i, w);
151+ // }
152+ // total = n;
153+ // centroid = 0;
154+ // getCentroid(1, 0);
155+ // cout << solve(centroid) << '\n';
156+ // return 0;
157+ //}
0 commit comments