社区讨论
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 条回复,欢迎继续交流。
正在加载回复...