为什么我的pushdown这样写也能ac?

P1253 扶苏的问题

焚魂 @ 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 来保证正确性。


|