馏栩梓 发表于 2025-6-9 18:49:46

浅谈斜率优化

浅谈斜率优化

概论

列出状态转移方程,如果能化简为以下的形式:

\=\min/\max(c+d+C)\]
此时我们就可以利用单调队列优化从做 \(O(n^2)\) 到 \(O(n)\) 的复杂度。
现在考虑更一般的情况,如果化简为以下形式:

\=\min/\max(a\cdot b+c+d+C)\]
此时单调队列优化就不再适用,就需要使用斜率优化。
斜率优化的思想就是通过剔除一些不可能成为最优解的决策点,使剩下的决策点形成一个凸包,再使用单调队列、二分、平衡树、CDQ 分治或者李超线段树来快速转移。
理论讲解

斜率优化有两种理解方式:
代数法

设决策点 \(j_2\) 优于 \(j_1\)。
则有:(\(\) 对应 \(\min\))

\\cdot b+c+d+Ca\cdot b+c+d+C\]
化简得:

\\cdot b+da\cdot b+d\]
令 \(Y(x)=-d\),\(X(x)=b\),\(k=a\),再让 \(X(j_2)>X(j_1)\)。
移项得(不等号要变号):

\;                t = t + t;                f = f + f;        }        memset(dp, 0x7f, sizeof dp);        dp = 0;        for (int i = 1; i > s;        for (int i = 1; i > t >> c;                t += t;                c += c;        }        int hh = 0, tt = 0;        q = 0;        for (int i = 1; i > s;        for (int i = 1; i > t >> c;                t += t;                c += c;        }        int hh = 0, tt = 0;        q = 0;        for (int i = 1; i > 1;                        if (dp] - dp] > (t + s) * (c] - c]))                        {                                r = mid;                        }                        else                        {                                l = mid + 1;                        }                }                dp = dp] + t * (c - c]) + s * (c - c]);                while (hh < tt && (dp] - dp]) * (c - c]) >= (dp - dp]) * (c] - c]))                {                        tt--;                }                q[++tt] = i;        }        coutn;        for (int i = 1; i > h;        }        for (int i = 1; i > w;                w = w + w;        }        p.k = -2 * h, p.b = h * h - w;        t.update(1, 1, M, 1);        for (int i = 2; i > m;        for (int i = 1; i > a;                a += a;                dp = a * a;        }        for (int j = 2; j > n >> ans;        for (int i = 1; i > a >> b >> r;                c = d = a / b;        }        sort(c + 1, c + n + 1);        for (int i = 1; i > m >> a >> b >> c;        for (int i = 1; i > tr.x >> tr.y >> tr.p >> tr.q;        }        sort(tr + 1, tr + m + 1, cmp);        q.insert(0);        for (int i = 1; i
页: [1]
查看完整版本: 浅谈斜率优化