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呢
求问大佬喵