斜率优化总结

来源:互联网 发布:软件著作权资助 编辑:程序博客网 时间:2024/05/24 06:22

一.上凸包

作用:求最大值

如果不等式最后化简得到dy/dx>k,那么应该用上凸包。

上凸包特点:随x递增,斜率递减


只要找到斜率最接近k且>=k的点,即是所求最大值

struct Point {    LL x, y;    Point() {}    Point(LL X, LL Y) {        x = X;        y = Y;    }    Point operator-(const Point &P)const {        return Point(x - P.x, y - P.y);    }    LL operator*(const Point &P)const {        return x * P.y - y * P.x;    }} P[MX], W[MX];int n, sz;LL solve() {    LL ret = 0;    sz = 0;    for (int i = 1; i <= n; i++) {        while (sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1]) <= 0) sz--;        W[++sz] = P[i];        int l = 1, r = sz, m1, m2;        while(l < r) {            int mid = l + (r - l) / 3;            int midr = r - (r - l) / 3;            if(f(mid, x) < f(midr, x)) l = mid + 1;            else r = midr - 1;        }        ret = max(ret, f(i, W[l].x));    }}


二.下凸包

作用:求最小值

如果不等式最后化简得到dy/dx<k,那么应该用下凸包。

下凸包特点:随x递增,斜率递增


只要找到斜率最接近k且<=k的点,即是所求最小值

while (sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1]) >= 0) sz--;


0 0
原创粉丝点击