就是说因为第二层 cdq 会这样写嘛:
auto solve1(int l, int r) {
if (l == r) return ;
auto mid = l + r >> 1;
solve1(l, mid);
for (auto i = l; i <= r; ++i) z[i] = y[i], z[i].id = i;
std::stable_sort(All(z, l, mid), [&] (Node x, Node y) {
return x.c == y.c ? (x.d == y.d ? (x.a == y.a ? x.b < y.b : x.a < y.a) : x.d < y.d) : x.c < y.c;
});
std::stable_sort(All(z, mid + 1, r), [&] (Node x, Node y) {
return x.c == y.c ? (x.d == y.d ? (x.a == y.a ? x.b < y.b : x.a < y.a) : x.d < y.d) : x.c < y.c;
});
auto p = l, q = mid + 1;
while (q <= r) {
while (p <= mid && z[p].c <= z[q].c) {
if (!z[p].part) BIT::upd(z[p].d, z[p].f);
p++;
}
if (z[q].part) z[q].f = std::max(z[q].f, BIT::ask(z[q].d) + z[q].e);
q++;
}
for (auto i = l; i <= r; ++i) {
y[z[i].id].f = z[i].f;
if (i <= mid && !y[i].part) BIT::clear(y[i].d);
}
solve1(mid + 1, r);
return ;
}
如果出现 a,b,c,d 都相同的点,那么肯定得是让 part 为 false 的优先,这样可以算出更长的子序列嘛,于是我就这样四个关键字排序,可以还是不太对,仍然会被全部相同的 hack 掉,改成 stable_sort 就对了。我知道 stable_sort 的正确性,但是能解释下为啥我之前那样排序是错的吗?之前错的(WA on Sub#0)code