維護由若干點(x, y)構成上凸包,並支援求給定乙個斜率k的求通過某個點截距的最大值, 需保證 x 遞增,
詢問 k 遞減是用query,否則用query2, 單次log(n), 判斷需要用到叉積, 注意是否會爆掉ll。
namespaceview codech 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;
}};}
維護由若干直線(y = k * x + m) 構成的下凸包,並支援給定乙個 x 座標, 求所有直線的 y 的最大值,
沒有用到叉積所以答案不怎麼會爆ll。
namespaceview codelc
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)
};}
斜率 凸包板子
先開個板子博再說。除了計算幾何,其他板塊中的 凸包 都指 凸殼 開始以為專題裡 凸包 指的是計算幾何,就先把板子寫了。結果題全是斜率優化。兩個向量 表示點積,表示叉積。求二維凸包用的是 andrew 演算法,把凸包分成兩個凸殼維護。將點按座標排序後每次檢查當前點是否在當前棧頂線段的右側。如果在右側則...
線段樹的各種板子
或者說葉節點 所代表的區間是1呀。想象成初中歷史書上的周朝等級制度圖就吼了呀!只不過是一顆樹而已。或者這麼看更吼?反正就是一顆樹辣!不是一顆賽艇!我承認走神了 義正言辭 真正的線段樹是這樣的。大概就是這樣!然後上強勢板子!include include include include define ...
Dp優化 斜率優化
該模板的ai要具有單調性,也就是sum陣列 若沒有單調性,加個二分即可 我的一篇題解,很詳細 1 寫出狀態轉移方程 2 按照斜率優化的式子推導出式子 3 代入模板即可。include include using namespace std typedef long long ll const int...