社区讨论
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 条回复,欢迎继续交流。
正在加载回复...