社区讨论
大佬们来看看这道题
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...