这两份代码只有dfs部分不同
一个将倍增放在for里面,一个是进入dfs时循环
个人不知道有什么问题
#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 3e5 + 10;
int n, k, ans, f[N][30], cnt[N], d[N], M;
int a[N];
vector <int> g[N];
void dfs (int u, int fa)
{
f[u][0] = fa;
d[u] = d[fa] + 1;
for (int i = 1; i <= M; i++)
{
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int i = 0; i < (int) g[u].size (); i++)
{
int v = g[u][i];
if (v == fa)
{
continue;
}
dfs (v, u);
}
return;
}
void get (int u, int fa)
{
for (int i = 0; i < (int) g[u].size (); i++)
{
int v = g[u][i];
if (v == fa)
{
continue;
}
get (v, u);
cnt[u] += cnt[v];
}
}
inline int lca (int x, int y)
{
if (d[x] > d[y]) swap (x, y);
for (int i = M; i >= 0; i--)
{
if (d[f[y][i]] >= d[x])
{
y = f[y][i];
}
}
if (x == y)
{
return x;
}
for (int i = M; i >= 0; i--)
{
if (f[x][i] != f[y][i])
{
x = f[x][i];
y = f[y][i];
}
}
return f[y][0];
}
int main ()
{
cin >> n;
M = (int) log (n) / log (2) + 1;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
g[u].push_back (v);
g[v].push_back (u);
}
dfs (1, 0);
for (int i = 2; i <= n; i++)
{
int s = a[i], t = a[i - 1];
int fa = lca (s, t);
cnt[s]++;
cnt[t]++;
cnt[fa]--;
cnt[f[fa][0]]--;
}
get (1, 0);
for (int i = 2; i <= n; i++)
{
cnt[a[i]]--;
}
for (int i = 1; i <= n; i++)
{
cout << cnt[i] << endl;
}
return 0;
}
#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 3e5 + 10;
int n, k, ans, f[N][30], cnt[N], d[N], M;
int a[N];
vector <int> g[N];
void dfs (int u, int fa)
{
f[u][0] = fa;
d[u] = d[fa] + 1;
for (int i = 1; i <= M; i++)
{
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int i = 0; i < (int) g[u].size (); i++)
{
int v = g[u][i];
if (v == fa)
{
continue;
}
dfs (v, u);
}
return;
}
void get (int u, int fa)
{
for (int i = 0; i < (int) g[u].size (); i++)
{
int v = g[u][i];
if (v == fa)
{
continue;
}
get (v, u);
cnt[u] += cnt[v];
}
}
inline int lca (int x, int y)
{
if (d[x] > d[y]) swap (x, y);
for (int i = M; i >= 0; i--)
{
if (d[f[y][i]] >= d[x])
{
y = f[y][i];
}
}
if (x == y)
{
return x;
}
for (int i = M; i >= 0; i--)
{
if (f[x][i] != f[y][i])
{
x = f[x][i];
y = f[y][i];
}
}
return f[y][0];
}
int main ()
{
cin >> n;
M = (int) log (n) / log (2) + 1;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
g[u].push_back (v);
g[v].push_back (u);
}
dfs (1, 0);
for (int i = 2; i <= n; i++)
{
int s = a[i], t = a[i - 1];
int fa = lca (s, t);
cnt[s]++;
cnt[t]++;
cnt[fa]--;
cnt[f[fa][0]]--;
}
get (1, 0);
for (int i = 2; i <= n; i++)
{
cnt[a[i]]--;
}
for (int i = 1; i <= n; i++)
{
cout << cnt[i] << endl;
}
return 0;
}