焚魂 @ 2024-09-13 11:42:24
RT,我的理解是如果先加再修改那么就得把add清零再修改,如果是先修改再加就得先下放修改的懒标记后再加,但是我的代码:
void pushdown(long long k,long long l,long long r,long long mid) {
if(mo[k] != -1e18) { //mo表示区间修改的懒标记
mod(k*2,l,mid,mo[k]);
mod(k*2+1,mid+1,r,mo[k]);
mo[k] = -1e18;
}
if(add[k]) { //add表示区间加的懒标记
jia(k*2,l,mid,add[k]);
jia(k*2+1,mid+1,r,add[k]);
}
add[k] = 0;
}
貌似并不能很好的满足这一逻辑却ac了,是我的理解出问题了还是数据的问题QAQ
by 焚魂 @ 2024-09-13 11:46:07
完整的代码在这里
by Annihilation_y @ 2024-09-13 11:46:27
@焚魂 我的理解是,就是你如果在每一次的对数组有影响的操作的时候都 Pushdown 了,那你的代码就是没问题的。没仔细看,说错了希望谅解。
by 焚魂 @ 2024-09-13 11:51:04
@yuhaoyang09 有一点理解了,应该是这么写对区间加操作来说顺序是没有问题的,而对于区间修改的操作,当目前区间是所修改区间的子集的时候,就会直接进行修改操作而不会pushdown,而如果不是子集而是有交集的情况,则会先pushdown下去,清除在此之前的mo和add中的对数列的影响,再递归下去直到某一区间到所求区间的子集时再直接修改,这样就在真正修改操作前把add的影响都清除了
by Annihilation_y @ 2024-09-13 14:33:33
@焚魂 应该是这样的。也就是用更多次 Pushdown 来保证正确性。