斜率優化應選擇凸包哪部分
阿新 • • 發佈:2019-01-04
如果最後的表示式中,得到
那麼我們就維護上凸包。
從左往右的上凸包
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];
LL A[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) {
m1 = (2 * l + r) / 3;
m2 = (l + 2 * r + 2) / 3;
if(f(i, W[m1].x) < f(i, W[m2].x)) l = m1 + 1;
else r = m2 - 1;
}
ret = max(ret, f(i, W[l].x));
}
}
從右往左的上凸包
for(int i = n; i >= 1; i--) {
while(sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1 ]) >= 0) sz--;
如果最後的表示式中,得到
那麼我們就維護下凸包。
從左往右的下凸包
for(int i = 1; i <= n; i++) {
while(sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1]) >= 0) sz--;
從右往左的下凸包
for(int i = n; i >= 1; i--) {
while(sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1]) <= 0) sz--;
對於是處理字首的情況,假如題目要求得到
設
如果我們把點當作
如果我們把點當作
(終於能無腦寫斜率優化了hhhh