P11049 [IOI 2024] 尼罗河船运
P11049 [IOI 2024] 尼罗河船运。
首先肯定是按照 W 排序,然后只有相邻的物品是可能选的。
fi=⎩⎨⎧fi−1+aimin(fi−1+ai,fi−2+bi−1+bi)min(fi−1+ai,fi−2+bi−1+bi,fi−3+bi−2+ai−1+bi)wi−wi−1>dwi−wi−1≤dwi−wi−2≤d
这玩意儿我们可以用矩阵乘法去维护。我们重新弄一个矩阵乘法表示 c.a[i][j]=min(c.a[i][j],a.a[i][k]+b.a[k][j]);。
矩阵
ai0+∞+∞+∞0+∞+∞+∞fi−1fi−2fi−3=fi=fi−1+aifi−1fi−2ai0+∞bi+bi−1+∞0+∞+∞+∞fi−1fi−2fi−3=fi−min(fi−1+ai,fi−2+bi−1+bi)fi−1fi−2ai0+∞bi+bi−1+∞0bi+ai−1+bi−2+∞+∞fi−1fi−2fi−3=fi=min(fi−1+ai,fi−2+bi−1+bi,fi−3+bi−2+ai−1+bi)fi−1fi−2
然后矩阵的维护就直接用线段树修改+查询了。
P4719 【模板】动态 DP
P4719 【模板】动态 DP。
有 m 次操作,每次操作给定 x,y,表示修改点 x 的权值为 y。你需要在每次操作之后求出这棵树的最大权独立集的权值大小。
首先肯定是 dp,普通的 dp 是:
fi,1=∑fv,0fi,0=∑max(fv,0,fv,1)
我们发现如果修改一个点,它的贡献将会一直上传,所以...我们可以尝试树链剖分,保证轻边的条数在 log 级别。
我们设 g 表示只考虑轻儿子。
fi,0=gi,0+max(fson,0,fson,1)fi,1=gi,1+fson,0
我们需要把这个转化成矩阵乘法,也是自定义 ⊕ 是求 max。
fi,0fi,1=gi,0gi,1gi,0−∞∗fj,0fj,1
然后我们每一次修改一个点就可以直接改,上传到重链顶端,然后一直向上跳。