李超树迷惑行为大赏

前情提要:大家好啊,我是李超树仙人。来教大家什么时候!只有一个交点!对这个部分使用,李超树!

写得很神经,很可能有笔误!

Part 1

通用高次多项式

支持新增次数不一样的整系数高次多项式,每次给出一个 \(x\) 查询多项式的最大值,满足系数的绝对值不超过 \(V\):

  • 在 \(O(\sqrt V)\) 以内,至多有 \(O(k)\) 个交点,\(k\) 是最高的次数。
  • 在 \(O(\sqrt V)\) 以外,至多只有一个交点。
  • 在 \(O(V)\) 以外没有交点。

于是对 \(\sqrt V\) 以内暴力,外部用李超树维护即可,这里证明第二条:

首先对两个多项式作差得到 \(h\),称系数绝对值最大为 \(V\)。不失一般性,可以设最高次项系数 \(c_k \ge 1\)。
如果 \(|c_k| \lt 1\) 是一个很小的浮点数,可以全体乘它的倒数,但这会导致 \(V\) 变大,所以一般仅适用于整系数的情况。

我们可以只考察正半轴 \(x \gt 1\) 的情况,因为 \(0\) 附近的情况和第二条无关,同时负半轴是对称的。
对多项式除以 \(x^{k-1} \gt 1\),不会影响零点的数量和位置,得到:

\[g(x) = \frac{h(x)}{x^{k-1}} = c_k x + c_{k-1} + \frac{c_{k-2}}{x} + \frac{c_{k-3}}{x^2} + \dots + \frac{c_0}{x^{k-1}} \]

然后求导:

\[ \begin{align*} g'(x) = c_k - \sum_{j=1}^{k-1} \frac{j \cdot c_{k-1-j}}{x^{j+1}} & \ge 1 - V \sum_{j=1}^{k-1} \frac{j}{x^{j+1}} \\ & \gt 1 - \frac{V}{(x - 1)^2} \end{align*} \]

最后一步是把求和号当无穷级数放缩了一下。
也就是说当 \(x \ge \sqrt{V} + 1\) 时,总是有 \(g'(x) \gt 0\),即在 \([\sqrt{V} + 1, +\infty)\) 上严格单调递增,最多只能穿过一次 \(0\)。得证。
我们后面还会用到这个证明。

细节

对于次数比较高的情况,可能算几下爆 int128 了,但是我们伟大的李超树在下传时只讨论 \(f(x)\) 和 \(g(x)\) 在 \(x\) 处谁更大。
我们不需要真的求值。可以从高位到低位模拟求值过程,即 \(v \leftarrow v \cdot x + (a_i - b_i)\):

  • 如果目前 \(|v| \gt \frac{V}{x-1}\),就算低次项系数全为 \(\pm V\) 也不会变号了,直接不用算了。
  • 这样一来过程中数值始终不会超过 \(|V^2|\)。

这样一来我们就可以比较大小了,而需要求值的话题目肯定会告诉你模数,所以也是没有问题的。

下面假设询问的 \(x \gt 1\),如果需要负半轴的话请再开一棵树。

int cmp(const Poly &A, const Poly &B, ll x, ll V) { // 返回 f(x) > g(x)
  assert(x > 1);

  ll v = 0;
  ll C = max(A.size(), B.size()) - 1;
  ll lim = V / (x - 1) + 1;        // 因为 x > 1,也可以写成 lim = V + 1

  for (int i = C; i >= 0; i--) {
    v = v * x + (A[i] - B[i]);     // 要判一下越界,懒得写了
    if (abs(v) > limit) return v > 0;
  }
  return v > 0; // 这里能判相等。比如返回一个 2,比如题目要你编号最小啊
}

注意代码里 \(V\) 是指减完以后最大的系数绝对值,不精细算的话可以传入值域。
其他的边界不重要,不确定的话可以开大 lim 的值,因为只是用来防止溢出的。

特殊高次多项式

考虑奇/偶多项式,这是指数之间间隔 \(d = 2\) 的情况。
依然沿用前面的证明方法,但是由于中间缺项,所以最后那个缩放会变成 4 次方,也就是说只要暴力枚举 \(\sqrt[4] V\) 以内即可。

\[1 \gt V \sum_{j=1}^{k-1} \frac{j}{(x^d)^{j+1}} \implies x^d - 1 \ge \sqrt{V} \implies B = (\sqrt{V} + 1)^{\frac{1}{d}} \]

再举个例子比如考虑间隔 \(d=0.5\),那么需要暴力枚举到 \(V\)。

再想一些神秘东西,比如 \(f(x) =\sum c_i 2^{ix}\),这个可以换元 \(u = 2^x\),就变成了普通多项式,于是只要枚举到 \(O(\log V)\)。

再想一些神秘东西,比如有负数指数 \(\sum_{i = -n}^n c_i x^i\),可以全部先乘一个 \(x^n\) 上去,这样变回了普通高次多项式。

Part 2

广义李超树

如果函数只有一个交点的话,就可以用李超树,所以一些四边形不等式 / 斜率优化 DP 可以直接李超树干过去了。

第一类是,有一个凸函数 \(g(t)\),因为它导数 \(g'(t)\) 单调,所以形如 \(f_{a, b}(x) = g(x - a_i) + b_i\) 作差以后是至多穿过一次零点的。

Eg0 平移来袭!

\[ \begin{align*} f_{a, b}(x) &= \sqrt{x - a_i} + b_i & (x \ge a_i) \\ f_{a, b}(x) &= \ln(x - a_i) + b_i & (x \gt a_i) \\ f_{a, b}(x) &= \frac{1}{x - a_i} + b_i & (x \gt a_i)\\ \end{align*} \]

具体原理就是 \(\sqrt{x}\)、\(\ln x\)、\(\frac{1}{x}\) 在 \(x \gt 0\) 的时候都凸/凹,插入的时候需要带定义域。

Eg1 全局固定 \(K\)。绝对值啊啊啊啊,您是只有一个交点。

\[f_{a, b}(x) = K |x - a_i| + b_i \]

Eg2 全局固定 \(K \gt 1\)。高次也是对的。

\[f_{a, b}(x) = |x - a_i|^K + b_i \]

Eg3 全局固定 \(K \ne 1\)。妈的 ReLU 类似物也是。

\[f_{a, b}(x) = K \max(0, x - a_i) + b_i \]

如果 \(k_i\) 互不相同,可以分开维护定义域小于等于/大于 \(a_i\) 的情况,这样只是多 \(\log\)。


Eg4 有一些二维点 \((a_i, b_i)\),每次询问 \((x,0)\) 到其中的欧氏距离最值。

\[f_{a, b}(x) = \sqrt{(x - a_i)^2 + b_i^2} \]

诶,这个可以平方以后斜率优化,但是下面这样就不行了。

Eg5 全局固定 \(K\)。

\[f_{a, b}(x) = \sqrt{(x - a_i)^2 + K^2} + b_i \]

蛤蛤蛤,我这样搞一下,你平方会消不掉根号,李超树王朝了!


Eg6 要求 \(x \gt 0\) 正半轴。\(p, q\) 为任意固定实数,如果相等的话可能要特判一下。

\[f_{a, b}(x) = a_i x^p + b_i x^q \]

这个非常牛,包括了对钩函数之类的复杂东西,想想看指数是 \(0.5, 1.5, -1\) 这种都是可以做的!

Eg7 要求 \(x \gt 0\) 正半轴。变指数也是可以的,指数依然可以取任意实数。这个证明可以取对数。

\[f_{k, p}(x) = k_i \cdot x^{p_i} \]


Eg8 设 \(g,h\) 分别严格单调,那么 \(f_{k, b}(x) = g\big(k \cdot h(x) + b\big)\) 也是至多一个交点的。

\[f_{a, b}(x) = a e^x + b \]

\[f_{a, b}(x) = e^{a x + b} \]

当然还有我们的 Sigmoid 哦呵呵呵,无语啊。

\[f_{a, b}(x) = \frac{1}{1 + e^{-(ax + b)}} \]

写眩晕了,以后再补吧 o(╥﹏╥)o

posted @ 2026-10-16 15:41  Aurora5090  阅读(27)  评论(0)    收藏  举报