如果你过了样例但是0tps,全wa...
查看原帖
如果你过了样例但是0tps,全wa...
130183
liyishui2003楼主2023/3/31 11:32

如果初始化的时候用的不是扫一遍update 而是build的时候直接读入然后pushup的话 这样子:

void build(int rt,int l,int r){
	if(l==r){
		a[rt]=1;
		lco[rt]=rco[rt]=w[l];
		//cout<<l<<" "<<lco[rt]<<endl;
		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]];
		//cout<<l<<" "<<lco[rt]<<endl;
		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++;// dfs order
	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]];
		//cout<<l<<" "<<lco[rt]<<endl;
		return;
	}

才是对的:D 关于我因为这个问题调了一个早上四节课这个故事><

2023/3/31 11:32
加载中...