社区讨论

WA求助! 40分

P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo8tucbl
此快照首次捕获于
2023/10/28 00:27
2 年前
此快照最后确认于
2023/10/28 00:27
2 年前
查看原帖
倍增LCA错误(样例都没过)
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
int n,t;
}e[5000001];
int head[5000001],sum;
int a[5000001];
int anser=0;
int lg[5000001];
int cha[5000001]; 
void add(int x,int y)
{
e[++sum].t=y;
	e[sum].n=head[x];
	head[x]=sum;
}
int depth[5000001], fa[5000001][60];
void dfs(int now,int fath)
{
fa[now][0]=fath;
depth[now]=depth[fath] + 1;
for(int i=1;i<=lg[30];++i)
fa[now][i]= fa[fa[now][i-1]][i-1];
for(int i=head[now];i!=0;i =e[i].n)
if(e[i].t!=fath)
dfs(e[i].t, now);
}
int LCA(int x,int y)
{
if(depth[x] < depth[y]) 
swap(x, y);
	while(depth[x] > depth[y])
	x=fa[x][lg[depth[x]-depth[y]]-1];
	if(x==y) 
    return x;
	for(int k=30; k>=0; --k)
	if(fa[x][k] != fa[y][k])
	x=fa[x][k],y=fa[y][k];
	return fa[x][0];
}
void ans(int now,int fath)
{
for(int i=head[now];i!=0;i =e[i].n)
if(e[i].t!=fath)
{
ans(e[i].t, now);	
cha[now]+=cha[e[i].t]; 
}
anser=max(anser,cha[now]);
}
int main()
{
int n,m,q;
cin>>n;
for(int i = 1; i <= n; ++i)
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
for(int i=1;i<=n;i++)
{
	cin>>a[i];
 } 
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs(1,0);
for(int i =1; i<n; i++)
	{
		int u=a[i],v=a[i + 1];
		int t=LCA(u,v);
		cha[fa[t][0]]-= 1;
		cha[t]-=1;
		cha[u]+=1;
		cha[v]+=1;
	}	
	ans(1,0);
	for(int i=2; i<=n;i++){
		cha[a[i]]--;
	}
	for(int i=1;i<=n;i++){
		cout<<cha[i]<<endl;
	}

return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...