max+ 或卷积
给定长度为
不难注意到这是一个位运算(或)上的
我们递归下去做就行,复杂度
void solve(int * a, int * b, int * c, int * tmp, int n) {
if (n == 1) return void (*c = max(*c, *a + *b));
solve(a, b, c, tmp, n >> 1);
solve(a, b + (n >> 1), c + (n >> 1), tmp, n >> 1);
rep(i, 0, (n >> 1) - 1) tmp[i] = b[i], b[i] = max(b[i], b[i + (n >> 1)]);
solve(a + (n >> 1), b, c + (n >> 1), tmp + (n >> 1), n >> 1);
rep(i, 0, (n >> 1) - 1) b[i] = tmp[i];
}