社区讨论

为什么>=是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 条回复,欢迎继续交流。

正在加载回复...