建虚树求助
查看原帖
建虚树求助
769863
_Lyk_def楼主2023/6/10 23:12

P2495 学习虚树的时候遇到了一点疑惑

按照自己理解写的建虚树

按照正确方法写的建虚树

其中只有大体只有建虚树的部分是不同的,核心代码:

30pts:

m=read(); tt=0,icnt=0;
for(int i=1;i<=m;i++) { query[i]=read(); tag[query[i]]=1; }
//输入关键点并标记
sort(query+1,query+m+1,cmp_dfn);//按dfn序排序
stk[++tt]=1;	//stk是栈
for(int i=1;i<=m;i++){
	int l=LCA(stk[tt],query[i]);
	if(stk[tt]!=l){	//当前点出栈连边,两点LCA入栈
		imerge(stk[tt],l);
		stk[tt--]=0;
		if(stk[tt]!=l) stk[++tt]=l;
	}
	stk[++tt]=query[i];
}
while(tt>1){
	int p=stk[tt]; stk[tt--]=0;
	imerge(p,stk[tt]);	//出栈,连虚边
}
printf("%lld\n",dp(1));	//虚树上dp
for(int i=1;i<=icnt;i++) ie[i].next=0;	//清空虚树

100pts:

m=read(); tt=0,icnt=0;
for(int i=1;i<=m;i++) { query[i]=read(); tag[query[i]]=1; }
sort(query+1,query+m+1,cmp_dfn);
//建虚树
stk[++tt]=1;
for(int i=1,lca;i<=m;i++){
	lca=LCA(stk[tt],query[i]);
	while(tt>1&&depth[lca]<=depth[stk[tt-1]]){	//这里没有很懂
		imerge(stk[tt],stk[tt-1]); tt--;		//出栈连边
	}
	if(stk[tt]^lca){	//lca入栈
		imerge(stk[tt],lca);
		stk[tt]=lca;
	}
	stk[++tt]=query[i];
}
while(tt>1){	//出栈连边
	int p=stk[tt]; stk[tt--]=0;
	imerge(p,stk[tt]);
}
printf("%lld\n",dp(1));	//dp~
for(int i=1;i<=icnt;i++) ie[i].next=0;	//清空~

为什么30pt写法会大大MLE呢

求问大佬喵

2023/6/10 23:12
加载中...