社区讨论

P10406蒟蒻40pts求调

灌水区参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lzv7dlsi
此快照首次捕获于
2024/08/15 19:34
2 年前
此快照最后确认于
2024/08/15 21:22
2 年前
查看原帖
rt
样例过了,自己造了个小数据也过了qwq

code

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e6+10;
int n,siz[N],cnt=0,hd[M],sum=0,rt[N],mxd[N],d[N];
int dis[M],mxx=0,ans=0,sum_d=0,dis_x,dis_y,far_x,far_y;
int x,y,k=0,r;
struct edge{
	int to,nxt;
}e[M<<1];
void add(int from,int to){
	e[++cnt].to=to;
	e[cnt].nxt=hd[from];
	hd[from]=cnt;
}
void dfs1(int u,int fa){
	for(int i=hd[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa)	continue;
		dis[v]=dis[u]+1;
		if(dis[v]>dis[k])	k=v,mxx=dis[v];
		dfs1(v,u);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&siz[i]);
		rt[i]=sum+1; 
		for(int j=2;j<=siz[i];j++){
			int fa,son=sum+j;
			scanf("%d",&fa);
			fa+=sum;
			add(fa,son);add(son,fa);
		}
		sum+=siz[i];
	}
	scanf("%d%d",&x,&y);
	y+=siz[1];
	for(int i=1;i<=n;i++){
		for(int j=rt[i];j<=rt[i]+siz[i]-1;j++)	dis[j]=0;
		mxx=k=0;
		dfs1(rt[i],0);
		d[i]=mxx;
		if(i==1)	dis_x=dis[x];
		else if(i==2)	dis_y=dis[y];
		if(i==1||i==2)	continue;
		for(int j=rt[i];j<=rt[i]+siz[i]-1;j++)		dis[j]=0;
		mxx=0;
		dfs1(k,0);
		mxd[i]=mxx;
		if((mxd[r]-d[r])<(mxd[i]-d[i]))	r=i;
		sum_d+=d[i];	
	}
	for(int j=rt[1];j<=rt[1]+siz[1]-1;j++)	dis[j]=0;
	mxx=k=0;
	dfs1(x,0);
	far_x=mxx;
	for(int j=rt[2];j<=rt[2]+siz[2]-1;j++)	dis[j]=0;
	mxx=k=0;
	dfs1(y,0);
	far_y=mxx;
	printf("d[%d]=%d\n",i,d[i]);
	ans=max(far_x+dis_y,far_y+dis_x)+sum_d;
	ans=max(ans,dis_x+dis_y+mxd[r]-d[r]);
	printf("%d",ans+n-1);
	return 0;
}
求大佬帮调T_T

回复

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

正在加载回复...