楼主经历过过不了样例和10分
说明:楼主是用树剖写的
(本人的)原因都一样:取相反数修改的时候混了
先看错误代码(没啥特殊之处,不用认真看):
#define pd(p) pushdown(p)
il void pushdown(re int p){
if(t[p].tag){
t[ls].sum=-t[ls].sum;
t[rs].sum=-t[rs].sum;
t[ls].Min=-t[ls].Max;
t[ls].Max=-t[ls].Min;
t[rs].Min=-t[rs].Max;
t[rs].Max=-t[rs].Min;
t[ls].tag=1-t[ls].tag;
t[rs].tag=1-t[rs].tag;
t[p].tag=1-t[p].tag;
}
}
错误原因:修改完t[ls].Min之后又用它去更新t[ls].Max,应该用修改之前的更新(这里写错可以过样例,得10分)
正确代码(如果错误原因看懂了可以不看):
#define pd(p) pushdown(p)
il void pushdown(re int p){
if(t[p].tag){
t[ls].sum=-t[ls].sum;
t[rs].sum=-t[rs].sum;
int Min=t[ls].Min;t[ls].Min=-t[ls].Max;
t[ls].Max=-Min;
Min=t[rs].Min;t[rs].Min=-t[rs].Max;
t[rs].Max=-Min;
t[ls].tag=1-t[ls].tag;
t[rs].tag=1-t[rs].tag;
t[p].tag=1-t[p].tag;
}
}