Homework Introduction
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, f[N], d[N], d2[N];
vector<int>e[N];
void dfs(int x, int fa) {
for (auto v : e[x]) {
if (v == fa)
continue;
dfs(v, x);
if (d[v] + 1 > d[x]) {
d2[x] = d[x];
d[x] = d[v] + 1;
} else if (d[v] + 1 > d2[x]) {
d2[x] = d[v] + 1;
}
}
}
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, 0);
int res = 0;
for (int i = 1; i <= n; i++) {
res = max(res, d[i] + d2[i]);
}
cout << res << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, fa[N][25], dep[N];
vector<int>e[N];
void dfs(int x, int f, int deep) {
dep[x] = deep;
fa[x][0] = f;
for (int j = 1; j <= 20; j++) {
fa[x][j] = fa[fa[x][j - 1]][j - 1];
}
for (auto v : e[x]) {
if (v == f)
continue;
dfs(v, x, deep + 1);
}
}
int lca(int x, int y) {
if (dep[x] > dep[y])
swap(x, y);
//1.让y与x同层
for (int j = 20; j >= 0; j--) {
if (dep[fa[y][j]] >= dep[x])
y = fa[y][j];
}
if (x == y)
return x;
for (int j = 20; j >= 0; j--) {
if (fa[x][j] != fa[y][j]) {
x = fa[x][j];
y = fa[y][j];
}
}
return fa[x][0];
}
int main() {
cin >> n >> m;
for (int i = 2; i <= n; i++) {
int x;
cin >> x;
e[x].push_back(i);
e[i].push_back(x);
}
dfs(1, 0, 1);
while (m--) {
int x, y;
cin >> x >> y;
cout << lca(x, y) << "\n";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, siz[N], dep[N], fa[N], son[N];
int top[N];
vector<int>e[N];
void dfs1(int x, int f, int deep) {
dep[x] = deep;
fa[x] = f;
siz[x] = 1;
int maxx = 0;
for (auto v : e[x]) {
if (v == f)
continue;
dfs1(v, x, deep + 1);
siz[x] += siz[v];
if (siz[v] > maxx) {
maxx = siz[v];
son[x] = v;
}
}
}
void dfs2(int x, int topfa) {
top[x] = topfa;
if (!son[x])
return;
dfs2(son[x], topfa);
for (auto v : e[x]) {
if (v == son[x] || v == fa[x])
continue;
dfs2(v, v);
}
}
int lca(int x, int y) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])
swap(x, y);
x = fa[top[x]];
}
if (dep[x] > dep[y])
swap(x, y);
return x;
}
int main() {
cin >> n >> m;
for (int i = 2; i <= n; i++) {
int x;
cin >> x;
e[x].push_back(i);
e[i].push_back(x);
}
dfs1(1, 0, 1);
dfs2(1, 1);
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
cout << lca(x, y) << endl;
}
return 0;
}
//sum[a]+sum[b]-2*sum[lca]
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, fa[N][25], dep[N], dis[N], b[N];
vector<int>e[N];
void dfs(int x, int f, int deep) {
dep[x] = deep;
fa[x][0] = f;
for (int j = 1; j <= 20; j++) {
fa[x][j] = fa[fa[x][j - 1]][j - 1];
}
for (auto v : e[x]) {
if (v == f)
continue;
dis[v] = dis[x] + 1;
dfs(v, x, deep + 1);
}
}
int lca(int x, int y) {
if (dep[x] > dep[y])
swap(x, y);
for (int j = 20; j >= 0; j--) {
if (dep[fa[y][j]] >= dep[x])
y = fa[y][j];
}
if (x == y)
return x;
for (int j = 20; j >= 0; j--) {
if (fa[x][j] != fa[y][j]) {
y = fa[y][j];
x = fa[x][j];
}
}
return fa[x][0];
}
void dfs2(int x, int fa) {
for (auto v : e[x]) {
if (v == fa)
continue;
dfs2(v, x);
b[x] += b[v];
}
}
int main() {
cin >> n >> m;
for (int i = 2; i <= n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, 0, 1);
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
b[x]++;
b[y]++;
int LCA = lca(x, y);
b[LCA]--;
b[fa[LCA][0]]--;
}
dfs2(1, 0);
for (int i = 1; i <= n; i++) {
cout << b[i] << " ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, m, a[N];
vector<int>e[N];
int siz[N], dep[N], son[N], fa[N];
int w[N], id[N], top[N], cnt;
int tree[N << 2];
void dfs1(int x, int f, int deep) {
fa[x] = f;
dep[x] = deep;
siz[x] = 1;
int maxx = 0;
for (auto v : e[x]) {
if (v == f)
continue;
dfs1(v, x, deep + 1);
siz[x] += siz[v];
if (siz[v] > maxx) {
son[x] = v;
maxx = siz[v];
}
}
}
void dfs2(int x, int topfa) {
id[x] = ++cnt;
w[cnt] = a[x];
top[x] = topfa;
if (!son[x])
return;
dfs2(son[x], topfa);
for (auto v : e[x]) {
if (v == fa[x] || v == son[x])
continue;
dfs2(v, v);
}
}
void pushup(int rt) {
tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
}
void build(int l, int r, int rt) {
if (l == r) {
tree[rt] = w[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void update(int l, int r, int rt, int p, int c) {
if (l == r) {
tree[rt] = c;
return;
}
int mid = (l + r) >> 1;
if (p <= mid)
update(l, mid, rt << 1, p, c);
else
update(mid + 1, r, rt << 1 | 1, p, c);
pushup(rt);
}
int query(int l, int r, int rt, int L, int R) {
if (L <= l && r <= R) {
return tree[rt];
}
int mid = (l + r) >> 1;
int res = 0;
if (L <= mid)
res += query(l, mid, rt << 1, L, R);
if (R > mid)
res += query(mid + 1, r, rt << 1 | 1, L, R);
return res;
}
int pos1(int x, int y) {
int res = 0;
while (top[x] != top[y]) {
if (dep[top[x]] > dep[top[y]])
swap(x, y);
res += query(1, n, 1, id[top[y]], id[y]);
y = fa[top[y]];
}
if (dep[x] > dep[y])
swap(x, y);
res += query(1, n, 1, id[x], id[y]);
return res;
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1, 0, 1);
dfs2(1, 1);
build(1, n, 1);
for (int i = 1; i <= m; i++) {
int pos, x, y, z;
cin >> pos >> x;
if (pos == 1) {
cin >> y;
update(1, n, 1, id[x], y);
} else {
cout << pos1(1, x) << endl;
}
}
return 0;
}
/*
f[x]以x为根,向下走的最大距离
g[x]从x向上走的最大距离
f[x][0] = max(f[v]+1)
f[x][1]
son[x][0] 最大值对应的儿子
son[x][1] 次大致对应的儿子
g[x]
1.向上走到fa[x]再向下走
2.从fa[x]向上走 g[fa]+1
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, dis[N][2], g[N], son[N][2], f[N];
vector<int>e[N];
void dfs1(int x, int fa) {
for (auto v : e[x]) {
if (v == fa)
continue;
dfs1(v, x);
if (dis[v][0] + 1 >= dis[x][0]) {
dis[x][1] = dis[x][0];
son[x][1] = son[x][0];
dis[x][0] = dis[v][0] + 1;
son[x][0] = v;
} else if (dis[v][0] + 1 > dis[x][1]) {
dis[x][1] = dis[v][0] + 1;
son[x][1] = v;
}
}
}
void dfs2(int x, int fa) {
if (x == 1) {
g[x] = 0;
f[x] = dis[x][0];
} else {
f[x] = dis[x][0];
if (son[fa][0] == x)
g[x] = max(g[fa] + 1, 1 + dis[fa][1]);
else {
g[x] = max(g[fa] + 1, 1 + dis[fa][0]);
}
f[x] = max(f[x], g[x]);
}
for (auto v : e[x]) {
if (v == fa)
continue;
dfs2(v, x);
}
}
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1, 0);
dfs2(1, 0);
for (int i = 1; i <= n; i++) {
cout << f[i] << " ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, res, siz[N], f[N], dis[N];
vector<int>e[N];
void dfs1(int x, int fa) {
siz[x] = 1;
for (auto v : e[x]) {
if (v == fa)
continue;
dis[v] = dis[x] + 1;
dfs1(v, x);
siz[x]+=siz[v];
}
}
void dfs2(int x, int fa) {
for (auto v : e[x]) {
if (v == fa)
continue;
f[v] = f[x] - siz[v] + (n - siz[v]);
dfs2(v, x);
}
}
signed main() {
cin >> n;
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1, 0);
for (int i = 1; i <= n; i++) {
f[1] += dis[i];
}
dfs2(1, 0);
for (int i = 1; i <= n; i++) {
cout << f[i] << " ";
}
return 0;
}
Problem
Please claim the assignment to see the problems.
- Status
- Live...
- Problem
- 22
- Open Since
- 2025-10-3 0:00
- Deadline
- 2025-12-31 23:59
- Extension
- 24 hour(s)