传送门
初学线段树,为了这个题思考了半个上午,没有任何结果,,,,老师禁止看题解因此来这里求救
目前的想法是存两个lazy,然后下放的时候分别判断
void tagdown(int x){
if(a[x].lazy1){
a[x*2].sum+=a[x].lazy1*(a[x*2].r-a[x*2].l+1);
a[x*2+1].sum+=a[x].lazy1*(a[x*2+1].r-a[x*2+1].l+1);
a[x*2].lazy1+=a[x].lazy1;
a[x*2+1].lazy1+=a[x].lazy1;
a[x].lazy1=0;
}
if(a[x].lazy2!=INF){
a[x*2].lazy2=a[x*2+1].lazy2=a[x].lazy2;
a[x*2].sum=(a[x*2].r-a[x*2].l+1)*a[x].lazy2;
a[x*2+1].sum=(a[x*2+1].r-a[x*2+1].l+1)*a[x].lazy2;
a[x*2].lazy1=a[x*2+1].lazy1=0;
a[x].lazy2=INF;
}
}
但是显然不行,,,先加再覆盖和先覆盖再加无法判断
一个新想法是lazy改成一个vector,下放的时候从后向前跳到最后一个覆盖操作,同时路上记录加的总和,但是感觉显然会超时