Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3216ab1

Browse files
2 parents ad29eb4 + 0865b16 commit 3216ab1

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed

‎tree/2-fixed-length-paths.cpp‎

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
using ll = long long;
4+
5+
const int maxn = 2e5+5;
6+
bool rem[maxn];
7+
int n, k1, k2, tmr, sz[maxn], dep[maxn], tin[maxn], tout[maxn], tour[maxn], ft[maxn];
8+
ll ans;
9+
vector<int> vs[maxn];
10+
11+
void upd(int pos, int val) {
12+
++pos;
13+
while(pos <= n) ft[pos] += val, pos += pos & (-pos);
14+
}
15+
16+
int query(int pos) {
17+
++pos;
18+
int ret = 0;
19+
while (pos > 0) ret += ft[pos], pos &= pos-1;
20+
return ret;
21+
}
22+
23+
void dfs(int v, int p = -1) {
24+
tour[tin[v] = tmr++] = v;
25+
sz[v] = 1;
26+
for(int e: vs[v]) if (e != p && !rem[e]) {
27+
dep[e] = dep[v] + 1;
28+
dfs(e, v);
29+
sz[v] += sz[e];
30+
}
31+
tout[v] = tmr;
32+
}
33+
34+
int centroid(int v, int p, int tsz) {
35+
for(int e: vs[v])
36+
if (e != p && !rem[e] && (sz[e] << 1) > tsz)
37+
return centroid(e, v, tsz);
38+
return v;
39+
}
40+
41+
void solve(int v) {
42+
dep[v] = tmr = 0, dfs(v);
43+
upd(0, 1);
44+
for(int e: vs[v]) if (!rem[e]) {
45+
for(int i = tin[e], u; i < tout[e]; i++) {
46+
u = tour[i];
47+
ans += query(k2 - dep[u]) - query(k1 - dep[u] - 1);
48+
}
49+
for(int i = tin[e]; i < tout[e]; i++) upd(dep[tour[i]], 1);
50+
}
51+
for(int e: vs[v]) if (!rem[e]) {
52+
for(int i = tin[e]; i < tout[e]; i++) upd(dep[tour[i]], -1);
53+
}
54+
upd(0, -1);
55+
}
56+
57+
void decompose(int v) {
58+
dep[v] = tmr = 0, dfs(v);
59+
int c = centroid(v, -1, sz[v]);
60+
solve(c);
61+
rem[c] = true;
62+
for(int e: vs[c]) if (!rem[e]) decompose(e);
63+
}
64+
65+
int main(){
66+
scanf("%d %d %d", &n, &k1, &k2);
67+
for(int i = 1, x, y; i < n; i++) {
68+
scanf("%d %d", &x, &y);
69+
vs[x].emplace_back(y);
70+
vs[y].emplace_back(x);
71+
}
72+
decompose(1);
73+
printf("%lld\n", ans);
74+
return 0;
75+
}
76+

‎tree/finding-a-centroid.cpp‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
using ll = long long;
4+
5+
const int maxn = 2e5+5;
6+
int n, sz[maxn];
7+
vector<int> vs[maxn];
8+
9+
void dfs(int v, int p = -1) {
10+
sz[v] = 1;
11+
for(int e: vs[v]) if (e != p) dfs(e, v), sz[v] += sz[e];
12+
}
13+
14+
int centroid(int v, int p = -1) {
15+
for(int e: vs[v]) if (e != p && (sz[e] << 1) > n) return centroid(e, v);
16+
return v;
17+
}
18+
19+
int main(){
20+
scanf("%d", &n);
21+
for(int i = 1, x, y; i < n; i++) {
22+
scanf("%d %d", &x, &y);
23+
vs[x].emplace_back(y);
24+
vs[y].emplace_back(x);
25+
}
26+
dfs(1);
27+
printf("%d\n", centroid(1));
28+
return 0;
29+
}
30+

‎tree/fixed-length-paths.cpp‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
using ll = long long;
4+
5+
const int maxn = 2e5+5;
6+
bool rem[maxn];
7+
int n, K, tmr, sz[maxn], tin[maxn], tout[maxn], tour[maxn], dep[maxn], cnt[maxn];
8+
ll ans = 0;
9+
vector<int> vs[maxn];
10+
11+
void dfs(int v, int p = -1) {
12+
tour[tin[v] = tmr++] = v;
13+
sz[v] = 1;
14+
for(int e: vs[v]) if (e != p && !rem[e]) {
15+
dep[e] = dep[v] + 1;
16+
dfs(e, v);
17+
sz[v] += sz[e];
18+
}
19+
tout[v] = tmr;
20+
}
21+
22+
int centroid(int v, int p, int tsize) {
23+
for(int e: vs[v])
24+
if (e != p && !rem[e] && (sz[e] << 1) > tsize)
25+
return centroid(e, v, tsize);
26+
return v;
27+
}
28+
29+
void solve(int v) {
30+
dep[v] = tmr = 0, dfs(v);
31+
cnt[0] = 1;
32+
for(int e: vs[v]) if (!rem[e]) {
33+
for(int i = tin[e], u; i < tout[e]; i++) {
34+
u = tour[i];
35+
if (dep[u] <= K) ans += cnt[K - dep[u]];
36+
}
37+
for(int i = tin[e]; i < tout[e]; i++) ++cnt[dep[tour[i]]];
38+
}
39+
for(int e: vs[v]) if (!rem[e]) {
40+
for(int i = tin[e]; i < tout[e]; i++) cnt[dep[tour[i]]] = 0;
41+
}
42+
}
43+
44+
void decompose(int v) {
45+
dep[v] = tmr = 0, dfs(v);
46+
int c = centroid(v, -1, sz[v]);
47+
solve(c);
48+
rem[c] = true;
49+
for(int e: vs[c]) if (!rem[e]) decompose(e);
50+
}
51+
52+
int main(){
53+
scanf("%d %d", &n, &K);
54+
for(int i = 1, x, y; i<n; i++) {
55+
scanf("%d %d", &x, &y);
56+
vs[x].emplace_back(y);
57+
vs[y].emplace_back(x);
58+
}
59+
decompose(1);
60+
printf("%lld\n", ans);
61+
return 0;
62+
}
63+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /