关于 $(\max,+)$ 卷积
  • 板块学术版
  • 楼主PTqwq
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/4/10 23:24
  • 上次更新2024/4/11 14:26:30
查看原帖
关于 $(\max,+)$ 卷积
448881
PTqwq楼主2024/4/10 23:24

如果 aa 是凸的,bb 无任何附加限制,那么这样求 (max⁡,+)(\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;
}
2024/4/10 23:24
加载中...