社区讨论

update超时了求调(玄关)

P3373【模板】线段树 2参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m024tsx1
此快照首次捕获于
2024/08/20 15:57
2 年前
此快照最后确认于
2024/08/20 16:06
2 年前
查看原帖
CPP
void pushdown(int root,int l,int r) {
	//下沉乘法懒标记 
	if(tr[root].tag1 != 1) {
		tr[root << 1].tag1 *= tr[root].tag1;
		tr[root << 1 | 1].tag1 *= tr[root].tag1;
		tr[root << 1].sum *= tr[root].tag1;
		tr[root << 1 | 1].sum *= tr[root].tag1;
		tr[root << 1].sum %= mod;
		tr[root << 1 | 1].sum %= mod;
		tr[root].tag1 = 1;
	}
	//下沉加法懒标记
	if(tr[root].tag2 > 0) {
		int mid = (l + r) >> 1;
		tr[root << 1].tag2 += tr[root].tag2;
		tr[root << 1 | 1].tag2 += tr[root].tag2;
		tr[root << 1].sum += (tr[root].tag2 * (mid - l + 1));
		tr[root << 1].sum %= mod;
		tr[root << 1].sum += (tr[root].tag2 * (r - mid));
		tr[root << 1].sum %= mod;
		tr[root].tag2 = 0;
	}
}

void update1(int root,int l,int r,int ql,int qr,int val) {
	if(ql <= l && qr >= r) {
		tr[root].tag1 *= val;
		tr[root].sum *= val;
		tr[root].sum %= mod;
		return;
	}
	pushdown(root,l,r);
	int mid = (l + r) >> 1;
	if(l <= mid) update1(root << 1,l,mid,ql,qr,val);
	if(r > mid) update1(root << 1 | 1,mid + 1,r,ql,qr,val);
	tr[root].sum = tr[root << 1].sum + tr[root << 1 | 1].sum;
	tr[root].sum %= mod;
	return;
}

void update2(int root,int l,int r,int ql,int qr,int val) {
	if(ql <= l && qr >= r) {
		tr[root].tag2 += val;
		tr[root].sum += (val * (r - l + 1));
		tr[root].sum %= mod;
		return;
	}
	pushdown(root,l,r);
	int mid = (l + r) >> 1;
	if(l <= mid) update2(root << 1,l,mid,ql,qr,val);
	if(r > mid) update2(root << 1 | 1,mid + 1,r,ql,qr,val);
	tr[root].sum = tr[root << 1].sum + tr[root << 1 | 1].sum;
	tr[root].sum %= mod;
	return;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...