20分求调,玄关
查看原帖
20分求调,玄关
231022
1234567890regis楼主2024/3/24 16:30
#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。。。

有没有巨佬帮我调一下?玄关

2024/3/24 16:30
加载中...