求调,或者给个hack数据

P1253 扶苏的问题

虽然跟正确性无关,但是我还是要说一句: ```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


|