一般斜率优化问题

· · 个人记录

class slope_dp { //最小化 f
public :
    inline long long X(int x);
    inline long long Y(int x);
    inline long double slope(int x, int y);
    inline long double slope(int x);
    inline void renew(int x, int y);
    inline void solve();
    long long q[miu];
    int l, r;
    long long f[miu];
    int n;
    slope_dp() {l = 1; r = 0;}
};
class Pxxxx : public slope_dp {
public:
    Pxxxx(){l = 1; r = 0;}
    //...
    inline long double slope(int x, int y) {
        if(X(y) == X(x)) return (long double)1e18;
        return (long double)((1.0 * Y(y) - 1.0 * Y(x)) / (1.0 * X(y) - 1.0 * X(x)));
    }
    inline void solve() {
        q[++r] = 0;
        for(int i = 1; i <= n; ++i) {
            while(l < r && slope(q[l], q[l + 1]) <= slope(i)) ++l; //若要最大化 f 此处变号
            renew(i, q[l]);
            while(l < r && slope(i, q[r]) <= slope(q[r - 1], q[r])) --r; //同上
            q[++r] = i;
        }
    }
}func;