返回顶部

note

标记永久化

void pushdown(int l,int r,int o) {
  if (add[o]) {
  	int m=((l+r)>>1);
  	add[o*2]+=add[o];
  	sum[o*2]+=add[o]*(m-l+1);
  	add[o*2+1]+=add[o];
  	sum[o*2+1]+=add[o]*(r-m);
  	add[o]=0;
  }
}

int update3(int l,int r,int o) {
  if (l>=L&&r<=R) {
  	add[o]+=v;
  	sum[o]+=(r-l+1)*v;
  }
  else {
  	pushdown(l,r,o);
  	int m=((l+r)>>1);
  	if (m>=L) update3(l,m,o*2);
  	if (m<R) update3(m+1,r,o*2+1);
  	sum[o]=sum[o*2]+sum[o*2+1];
  }
}

int query3(int l,int r,int o) {
  if (l>=L&&r<=R) return sum[o];
  else {
  	pushdown(l,r,o);
  	int m=((l+r)>>1);
  	if (m>=R) return query3(l,m,o*2);
  	if (m<L) return query3(m+1,r,o*2+1);
  	return query3(l,m,o*2)+query3(m+1,r,o*2+1);
  }
}

懒惰标记


void update2(int l,int r,int o) {
  if (l>=L&&r<=R) {
  	add[o]+=v;
  	sum[o]+=(r-l+1)*v;
  }
  else {
  	int m=((l+r)>>1);
  	if (m>=L) update2(l,m,o*2);
  	if (m<R) update2(m+1,r,o*2+1);
  	sum[o]=sum[o*2]+sum[o*2+1]+add[o]*(r-l+1);
  }
}

int query2(int l,int r,int o) {
  if (l>=L&&r<=R) return sum[o];
  else {
  	int m=((l+r)>>1);
  	int v=(min(R,r)-max(L,l)+1)*add[o];
  	if (m>=R) return query2(l,m,o*2)+v;
  	if (m<L) return query2(m+1,r,o*2+1)+v;
  	return query2(l,m,o*2)+query2(m+1,r,o*2+1)+v;
  }
}
posted @ 2020-10-01 15:37  ZZDoctor  阅读(117)  评论(0编辑  收藏  举报
Live2D
});