虽然跟正确性无关,但是我还是要说一句:
```cpp
int query(int l,int r,int k){
if(l <= rt[k].l && rt[k].r <= r)
return rt[k].ans;
int aans = -1e9-1;
pushdown(k);
if(r >= rt[k<<1|1].l)aans = max(aans,query(l,r,k<<1|1));
if(l <= rt[k<<1].r)aans = max(aans,query(l,r,k<<1));
rt[k].ans=max(rt[k<<1].ans,rt[k<<1|1].ans);
return aans;
}
```
查询又没有修改,为什么要 `pushup` 呢?
by Endline @ 2023-10-08 14:39:53
在 pushdown 函数中,如果 `rt[k].tag1` 和 `rt[k].tag2` 同时有过标记,那就应该先下传 `tag1`,再下传 `tag2`,而不是在 `tag1` 下传后就把 `tag2` 清零。
by seasons_turn @ 2023-10-08 15:13:03
原因是:如果先进行修改操作,再进行增加操作,这时整个区间的最大值就是修改的值加上增加的值。
by seasons_turn @ 2023-10-08 15:14:35
1e6的输入,建议使用scanf
by Kevinx @ 2023-10-08 15:23:57
@[Endline](/user/401052) 我也很奇怪,删了分就更低了
by yiyi049 @ 2023-10-09 13:08:07
@[seasons_turn](/user/951739)
如果一个区间被修改了,那他之前的add标记也无效了,清0好像没什么问题。你说的是应该要在添加add标记的时候把修改的标记下传,不过好像还是不行。
题目说60%数据没有修改操作,我是50分,所以应该是还有别的地方写挂了。
我慢慢看吧,感谢你的回复
by yiyi049 @ 2023-10-09 13:11:29
@[yiyi049](/user/518124) `updata1`、`updata2` 和 `query` 都存在一个问题。你写的是这样的:
```cpp
if(r >= rt[k<<1|1].l)updata1(l,r,k<<1|1,val);
if(l <= rt[k<<1].r)updata1(l,r,k<<1,val);
```
这样就会出现一个问题:修改子树时,要修改的区间却没有变,这就可能导致区间修改到其他的区域。建议改成这种写法:
```cpp
int mid=(rt[k].l+rt[k].r)>>1;
if(r<=mid){
updata1(l,r,k<<1,val);
}
else if(l>mid){
updata1(l,r,k<<1|1,val);
}
else{
updata1(l,mid,k<<1,val);
updata1(mid+1,r,k<<1|1,val);
}
```
by seasons_turn @ 2023-10-09 17:05:28