我在某题写了这样一段代码:
int merge(int st,int s){
if(!s) return 0;
for(int x=st;;x=so[x]){
int ns=sz[st]-sz[so[x]];
if(ns*2>=s){
fa[lc[x]=merge(st,sz[st]-sz[x])]=fa[rc[x]=merge(so[x],s-ns)]=x;
upd(x);return x;
}
}
}
本机是正常的(在同学的Ubuntu上也正常)
交到洛谷上某些时候就会出玄学锅,比如有东西fa[x]=x
改成这样:
int merge(int st,int s){
if(!s) return 0;
for(int x=st;;x=so[x]){
int ns=sz[st]-sz[so[x]];
if(ns*2>=s){
lc[x]=merge(st,sz[st]-sz[x]);rc[x]=merge(so[x],s-ns);
fa[lc[x]]=fa[rc[x]]=x;upd(x);
return x;
}
}
}
在洛谷上就正常了……
调了一上午……