李超树迷惑行为大赏
前情提要:大家好啊,我是李超树仙人。来教大家什么时候!只有一个交点!对这个部分使用,李超树!
写得很神经,很可能有笔误!
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\),不会影响零点的数量和位置,得到:
然后求导:
最后一步是把求和号当无穷级数放缩了一下。
也就是说当 \(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\) 以内即可。
再举个例子比如考虑间隔 \(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 平移来袭!
具体原理就是 \(\sqrt{x}\)、\(\ln x\)、\(\frac{1}{x}\) 在 \(x \gt 0\) 的时候都凸/凹,插入的时候需要带定义域。
Eg1 全局固定 \(K\)。绝对值啊啊啊啊,您是只有一个交点。
Eg2 全局固定 \(K \gt 1\)。高次也是对的。
Eg3 全局固定 \(K \ne 1\)。妈的 ReLU 类似物也是。
如果 \(k_i\) 互不相同,可以分开维护定义域小于等于/大于 \(a_i\) 的情况,这样只是多 \(\log\)。
Eg4 有一些二维点 \((a_i, b_i)\),每次询问 \((x,0)\) 到其中的欧氏距离最值。
诶,这个可以平方以后斜率优化,但是下面这样就不行了。
Eg5 全局固定 \(K\)。
蛤蛤蛤,我这样搞一下,你平方会消不掉根号,李超树王朝了!
Eg6 要求 \(x \gt 0\) 正半轴。\(p, q\) 为任意固定实数,如果相等的话可能要特判一下。
这个非常牛,包括了对钩函数之类的复杂东西,想想看指数是 \(0.5, 1.5, -1\) 这种都是可以做的!
Eg7 要求 \(x \gt 0\) 正半轴。变指数也是可以的,指数依然可以取任意实数。这个证明可以取对数。
Eg8 设 \(g,h\) 分别严格单调,那么 \(f_{k, b}(x) = g\big(k \cdot h(x) + b\big)\) 也是至多一个交点的。
当然还有我们的 Sigmoid 哦呵呵呵,无语啊。
写眩晕了,以后再补吧 o(╥﹏╥)o

浙公网安备 33010602011771号