如果初始化的时候用的不是扫一遍update
而是build的时候直接读入然后pushup的话
这样子:
void build(int rt,int l,int r){
if(l==r){
a[rt]=1;
lco[rt]=rco[rt]=w[l];
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
push_up(rt);
}
是错的,显然不能直接用l;
但是这样子:
void build(int rt,int l,int r){
if(l==r){
a[rt]=1;
lco[rt]=rco[rt]=w[id[l]];
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
push_up(rt);
}
也是错的...
得在求新的id时顺便记录一下新的编号对应于原来的点,称做invid
void dfs2(int u,int topf){
cnt++;
id[u]=cnt;
invid[cnt]=u;
然后...
void build(int rt,int l,int r){
if(l==r){
a[rt]=1;
lco[rt]=rco[rt]=w[invid[l]];
return;
}
才是对的:D
关于我因为这个问题调了一个早上四节课这个故事><