#include <iostream>
#include <vector>
#include <queue>
#define int long long
using namespace std;
const int MAXN = (1 << 17) + 7;
vector<int> to[MAXN], lcato[MAXN];
int lca[MAXN], ans[MAXN], in[MAXN], st[MAXN][20], fa[MAXN], dep[MAXN], sz[MAXN];
int LCA(int x,int y)
{
if (dep[x] < dep[y]) swap(x,y);
for (int i=16;i>=0;i--) if (dep[st[x][i]] >= dep[y]) x = st[x][i];
for (int i=16;i>=0;i--) if (st[x][i] != st[y][i]) x = st[x][i], y = st[y][i];
return (x == y ? x : st[x][0]);
}
int dfs(int son, int fat)
{
int cnt = 1;
for (int i : lcato[son])
if (i != fat)
cnt += dfs(i, son);
return ans[son] = cnt;
}
signed main()
{
int n, idx;
cin >> n;
for (int i=1;i<=n;i++)
{
int a; lca[i] = i;
while ((cin >> a), a) to[a].push_back(i), in[i]++;
}
queue<int> q;
for (int i=1;i<=n;i++)
{
if (in[i] == 0)
{
q.push(i);
fa[i] = 0;
idx = i;
}
}
while (!q.empty())
{
int x = q.front(); q.pop();
// cout<<x<<'\n';
lcato[fa[x]].push_back(x),lcato[x].push_back(fa[x]);
dep[x] = dep[fa[x]] + 1; st[x][0] = fa[x];
for (int i=1;i<=16;i++) st[x][i] = st[st[x][i-1]][i-1];
for (int i : to[x])
{
if (fa[i] == 0) fa[i] = x;
else fa[i] = LCA(fa[i], x);
if (--in[i] == 0) q.push(i);
}
}
//for(int i=1;i<=n;i++)for(int j:lcato[i])cout<<i<<' '<<j<<endl;
dfs(idx, 0);
for (int i=1;i<=n;i++) cout << ans[i] - 1 << endl;
}
第一&三个点AC,其他全WA。。。
有没有巨佬帮我调一下?玄关