社区讨论

大佬们来看看这道题

学术版参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi6yqmv7
此快照首次捕获于
2025/11/20 13:00
4 个月前
此快照最后确认于
2025/11/20 13:00
4 个月前
查看原帖
RT
我被自己的内存卡了
顺便请大佬看看怎么优化
CPP
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int N=1000005;
struct data
{
	int from,to;
}A[N<<1],B[N<<1];
struct EDGEE
{
	int nxt,to;
}edge[N<<1];
int tot=0,head[N];
int f[N][30],dep[N],sum[N],q[N<<2];
int n,stp,ans,minn=0x7fffffff;
int m1,m2;
inline void add(int x,int y)
{
	edge[++tot].nxt=head[x];
	edge[tot].to=y;
	head[x]=tot;
}
void bfs()
{
	int Head=1,tail=0;
	dep[1]=1;f[1][0]=0;
	q[++tail]=1;
	while(Head<=tail)
	{
		int now=q[Head++];
		for(int i=head[now];i;i=edge[i].nxt)
		{
			int tt=edge[i].to;
			if(dep[tt]) continue ;
			dep[tt]=dep[now]+1;
			f[tt][0]=now;
			for(int j=1;j<=stp;j++)
				f[tt][j]=f[f[tt][j-1]][j-1];
			q[++tail]=tt;
		}
	}
}
inline int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=stp;i>=0;i--) 
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=stp;i>=0;i--)
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
void dfs(int x)
{
	for(int i=head[x];i;i=edge[i].nxt)
	{
		int tt=edge[i].to;
		if(tt==f[x][0]) continue;
		dfs(tt);
		sum[x]+=sum[tt];
	}
	if(x==1) return ;
	if(sum[x]+1<minn) minn=sum[x]+1,ans=1;
	else if(sum[x]+1==minn) ans++;
}
inline void ADD(int ff)
{
	if(ff==1)
		for(int i=1;i<n;i++)
			add(A[i].from,A[i].to),add(A[i].to,A[i].from);
	else
		for(int i=1;i<n;i++)
			add(B[i].from,B[i].to),add(B[i].to,B[i].from);
	
}
inline void ClearE()
{
	memset(edge,0,sizeof(edge));
	memset(head,0,sizeof(head));
	memset(sum,0,sizeof(sum));
	memset(f,0,sizeof(f));
	tot=0;
}
int x,y;
int main()
{
//	freopen("A.in","r",stdin);
//	freopen("A.out","w",stdout);
	n=read();
	stp=(int)log2(n)+1;
	for(int i=1;i<n;i++)
	{
		x=read();y=read();
		A[i].from=x,A[i].to=y;
	}
	
	for(int i=1;i<n;i++)
	{
		x=read();y=read();
		B[i].from=x,B[i].to=y;
	}
	ADD(1);
	bfs();
	for(int i=1;i<n;i++)
	{
		sum[B[i].from]++;
		sum[B[i].to]++;
		sum[lca(B[i].from,B[i].to)]-=2;
	}
	dfs(1);
	
	if(minn==2)
	{
//		for(int i=1;i<=n;i++)
//			printf("%d ",sum[i]);
//		puts("");
		printf("%d %d\n",minn,ans);
//		io<<minn<<' '<<ans<<'\n';
		return 0;
	}
	ClearE();
	ADD(2);
	bfs();
	for(int i=1;i<n;i++)
	{
		sum[A[i].from]++;
		sum[A[i].to]++;
		sum[lca(A[i].from,A[i].to)]-=2;
//		cout<<lca(A[i].from,A[i].to)<<endl;
	}
	dfs(1);
	printf("%d %d\n",minn,ans);
	return 0;
}

回复

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

正在加载回复...