注意在把 tag 中传递到 Info 时,需要先更新历史最大值,再更新最大值,因为历史最大值的更新需要用到更新前的最大值。
具体的,你的代码不应该是:
Info operator + (Info lhs, Tag rhs) {
auto [add, cov, hadd, hcov] = rhs;
lhs.hmaxv = max({lhs.hmaxv, lhs.maxv + hadd, hcov});
if (cov != -inf) {
lhs.maxv = cov;
} else {
lhs.maxv += add;
}
return lhs;
}
而不是
Info operator + (Info lhs, Tag rhs) {
auto [add, cov, hadd, hcov] = rhs;
if (cov != -inf) {
lhs.maxv = cov;
} else {
lhs.maxv += add;
}
lhs.hmaxv = max({lhs.hmaxv, lhs.maxv + hadd, hcov});
return lhs;
}
给出一组讨论区的 hack。
2
0 0
3
P 1 2 4
C 1 2 1
A 2 2
应输出 4。