第 1 个测试点本地测没问题,但不是 RE 就是 MLE,求解答:
#include <bits/stdc++.h>
using namespace std;
const int SIZE = 5e6 + 10;
int N;
int A[SIZE];
vector<int> G[SIZE], DA, DB;
int dfn[SIZE], Time_Stamp;
int F[SIZE][22], Posa[SIZE], Posb[SIZE];
int Result[SIZE], Fa[SIZE];
void DFS(int u, int fa)
{
if (!dfn[u])
dfn[u] = ++ Time_Stamp;
DA.push_back(u);
for (auto c : G[u])
{
if (c == fa) continue;
Fa[c] = u;
DFS(c, u);
DA.push_back(u);
}
}
int Build()
{
memset(F, 0x3f, sizeof F);
int M = log2(DB.size()) + 1;
for (int j = 0; j < M; j ++)
for (int i = 0; i + (1 << j) - 1 < DB.size(); i ++)
if (!j) F[i][j] = DB[i];
else F[i][j] = min(F[i][j - 1], F[i + (1 << j - 1)][j - 1]);
}
int Query(int l, int r)
{
int len = r - l + 1, K = log2(len);
return min(F[l][K], F[r - (1 << K) + 1][K]);
}
int LCA(int u, int v)
{
if (Posb[u] > Posb[v]) swap(u, v);
return Posa[Query(Posb[u], Posb[v])];
}
void DFS2(int u, int fa)
{
for (auto c : G[u])
{
if (c == fa) continue;
DFS2(c, u);
Result[u] += Result[c];
}
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
for (int i = 1; i <= N; i ++)
cin >> A[i];
for (int i = 1; i < N; i ++)
{
int u, v;
cin >> u >> v;
G[u].push_back(v), G[v].push_back(u);
}
DFS(1, -1);
for (int i = 0; i < DA.size(); i ++)
DB.push_back(dfn[DA[i]]), Posa[dfn[DA[i]]] = DA[i], Posb[DA[i]] = i;
Build();
for (int i = 1; i < N; i ++)
Result[A[i]] ++, Result[A[i + 1]] ++, Result[LCA(A[i], A[i + 1])] --, Result[Fa[LCA(A[i], A[i + 1])]] --;
DFS2(1, -1);
for (int i = 2; i <= N; i ++)
Result[A[i]] --;
for (int i = 1; i <= N; i ++)
cout << Result[i] << endl;
return 0;
}