斜率優化的各種板子

2022-09-06 19:57:18 字數 1419 閱讀 2868

維護由若干點(x, y)構成上凸包,並支援求給定乙個斜率k的求通過某個點截距的最大值, 需保證 x 遞增,

詢問 k 遞減是用query,否則用query2, 單次log(n), 判斷需要用到叉積, 注意是否會爆掉ll。

namespace

ch point

operator - (const point &rhs) const

};inline ll det(point a, point b)

struct

convexhull

void

add(ll x, ll y)

ll query(ll k)

ll query2(ll k)

return p[pos].y - k *p[pos].x;

}};}

view code

維護由若干直線(y = k * x + m) 構成的下凸包,並支援給定乙個 x 座標, 求所有直線的 y 的最大值, 

沒有用到叉積所以答案不怎麼會爆ll。

namespace

lc

bool

operator

< (ll x) const

};struct linecontainer : multiset>

bool

isect(iterator x, iterator y)

if (x->k == y->k) x->p = x->m > y->m ? inf : -inf;

else x->p = div(y->m - x->m, x->k - y->k);

return x->p >= y->p;

}void

add(ll k, ll m) ), y = z++, x =y;

while (isect(y, z)) z =erase(z);

if (x != begin() && isect(--x, y)) isect(x, y =erase(y));

while ((y = x) != begin() && (--x)->p >= y->p)

isect(x, erase(y));

}ll query(ll x)

};struct

linearlinecontainer

ll div(ll a, ll b)

bool isect(line &x, line &y)

void

add(ll k, ll m) ;

if(be <= ed &&isect(l[ed], cur))

while(be < ed && l[ed - 1].p >=l[ed].p)

l[++ed] =cur;

}ll query(ll x)

};}

view code

斜率 凸包板子

先開個板子博再說。除了計算幾何,其他板塊中的 凸包 都指 凸殼 開始以為專題裡 凸包 指的是計算幾何,就先把板子寫了。結果題全是斜率優化。兩個向量 表示點積,表示叉積。求二維凸包用的是 andrew 演算法,把凸包分成兩個凸殼維護。將點按座標排序後每次檢查當前點是否在當前棧頂線段的右側。如果在右側則...

線段樹的各種板子

或者說葉節點 所代表的區間是1呀。想象成初中歷史書上的周朝等級制度圖就吼了呀!只不過是一顆樹而已。或者這麼看更吼?反正就是一顆樹辣!不是一顆賽艇!我承認走神了 義正言辭 真正的線段樹是這樣的。大概就是這樣!然後上強勢板子!include include include include define ...

Dp優化 斜率優化

該模板的ai要具有單調性,也就是sum陣列 若沒有單調性,加個二分即可 我的一篇題解,很詳細 1 寫出狀態轉移方程 2 按照斜率優化的式子推導出式子 3 代入模板即可。include include using namespace std typedef long long ll const int...