dp
决策单调性
前提:满足四边形不等式
若
i
<
a
<
b
<
j
i<a<b<j
i<a<b<j
w
(
i
,
b
)
+
w
(
a
,
j
)
<
w
(
i
,
j
)
+
w
(
a
,
b
)
w(i,b)+w(a,j)<w(i,j)+w(a,b)
w(i,b)+w(a,j)<w(i,j)+w(a,b)
相当于决策点是不降的。
把序列分成k段,每段的价值为
w
(
i
,
j
)
w(i,j)
w(i,j)
ex:和的平方
d
p
i
,
k
=
m
i
n
(
d
p
j
,
k
−
1
+
w
(
j
,
i
)
)
.
dp_{i,k}=min(dp_{j,k-1}+w(j,i)).
dpi,k=min(dpj,k−1+w(j,i)).
知道了dp有决策单调后,可以分治
s
o
l
v
e
(
l
,
r
,
o
p
t
l
,
o
p
t
r
)
solve(l,r,opt_l,opt_r)
solve(l,r,optl,optr)
求出
m
i
d
=
l
+
r
>
>
1
mid=l+r>>1
mid=l+r>>1的opt(for一遍),然后递归下一层。同时这个东西在每一层支持莫队一样的统计方式,强行把指针跳到想要的位置。
然而这个做法需要上一层用来转移的都算出来了,,,,
如果是形如
f
i
=
m
i
n
(
f
j
+
w
(
j
,
i
)
)
f_i=min(f_j+w(j,i))
fi=min(fj+w(j,i))的方程
可以用单调栈,栈中存每个决策点决策的段,每次出现一个新的决策点,和栈顶的元素二分找位置。
斜率优化
一般写成
d
p
i
=
m
i
n
/
m
a
x
(
a
j
+
b
j
∗
c
i
)
+
d
i
dp_i=min/max(a_j+b_j*c_i)+d_i
dpi=min/max(aj+bj∗ci)+di
首先不管
d
i
d_i
di,把(
b
j
b_j
bj,
a
j
a_j
aj)看成平面上的点。撞到点时在y轴上的截距就是这个点的贡献,拿一条斜率为-
c
i
c_i
ci的线从下往上移动,第一个撞到的就是最小值。显然这些点只会在下凸壳上,找出下凸壳可以二分找点。
图论
冷知识== dag的反图dfs出栈序列是一个合格的拓扑序列
一个拓扑序要求1最靠前,再让2最靠前,等价于反图最大字典序
每个正则二分图(所有点度数相同)都有完美匹配
霍尔定理:对于一个二分图对于左边任意一个点集,出边点集的siz>=点集大小,那么这个图有完美匹配。