如果 a 是凸的,b 无任何附加限制,那么这样求 (max,+) 卷积到底错在哪了:
std :: vector < i64 > max_add_convolution (std :: vector < i64 > a, std :: vector < i64 > b) {
std :: vector < i64 > c;
c.clear ();
int siza = (int) a.size ();
int sizb = (int) b.size ();
for (int i = 0;i <= siza + sizb - 2; ++ i) c.emplace_back (-4e18);
int sizc = (int) c.size ();
auto f = [&] (int x, int y) -> i64 {
if (x < y || x - y >= sizb) return -4e18;
return a[y] + b[x - y];
};
auto work = [&] (auto self, int L, int R, int l, int r) -> void {
int mid = (L + R) / 2;
c[mid] = -4e18;
int res = l;
for (int i = l;i <= r; ++ i) {
if (f (mid, i) > c[mid]) {
c[mid] = f (mid, i);
res = i;
}
}
if (L <= mid - 1) self (self, L, mid - 1, l, res);
if (mid + 1 <= R) self (self, mid + 1, R, res, r);
return ;
};
work (work, 0, sizc - 1, 0, siza - 1);
return c;
}