社区讨论
为什么>=是82分,>是100分
P3995 树链剖分参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo99wrve
- 此快照首次捕获于
- 2023/10/28 07:57 2 年前
- 此快照最后确认于
- 2023/10/28 07:57 2 年前
为什么dfs2里的if(size[too]>=size[son[x]])改成>就是82
CPP#include<iostream>
#include<cstdio>
#define maxn 100010
using namespace std;
int head[maxn],num,n,q,d[maxn],lg[maxn],size[maxn],fa[maxn][21],son[maxn];
struct node{int nxt,to;}edge[maxn*2];
void add(int st,int ed)
{
edge[++num].nxt=head[st];
edge[num].to=ed;
head[st]=num;
}
void dfs1(int x,int dep)
{
d[x]=dep;
for(int i=1;i<lg[d[x]];i++)fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x];i;i=edge[i].nxt)
{
int too=edge[i].to;
if(!d[too])fa[too][0]=x,dfs1(too,dep+1);
}
}
int lca(int x,int y)
{
if(x==y)return x;
if(d[x]<d[y])swap(x,y);
for(int i=lg[d[x]];i>=0;i--)
if(d[x]-(1<<i)>=d[y])x=fa[x][i];
if(x==y)return y;
for(int i=lg[d[x]];i>=0;i--)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
void dfs2(int x)
{
for(int i=head[x];i;i=edge[i].nxt)
{
int too=edge[i].to;
if(too==fa[x][0])continue;
dfs2(too);size[x]+=size[too];
if(size[too]>=size[son[x]]||!son[x])son[x]=too;
}
}
int main()
{
//freopen("div.in","r",stdin);
//freopen("div.out","w",stdout);
cin>>n>>q;int aa,bb,a,b;
for(int i=1;i<n;i++)
{
scanf("%d%d",&aa,&bb);
add(aa,bb);add(bb,aa);
}
for(int i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<lg[i-1]==i);
dfs1(1,1);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
int o=lca(a,b);
if(fa[a][0]!=o)size[a]++,size[o]--;
if(fa[b][0]!=o)size[b]++,size[o]--;//考虑特殊情况
}
dfs2(1);
for(int i=1;i<=n;i++)printf("%d\n",son[i]);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...