ZLOJ练习29总结
written on 2022-06-29
前三题太水就不说了。
先来看一下 \(D\) 题,考试的时候居然只写了爆搜,但是对于部分分数据,dp 的思路应该是很显然的!设 \(f_{i,j}\) 表示前 \(i\) 个人买 \(j\) 幅彩色画的情况数,转移显然。对于每次更改都跑一次,总复杂度 \(O(npC)\)。只是要注意一个转化,也就是答案等于总方案数减去不合法方案数,因为 \(C\) 较小。考试的时候没打这个部分分的确是值得反思的地方。
这题的优化是很值得学习的地方,讲一下思考的历程吧。
首先原方法很显著的一个瓶颈就在于每一次操作都要重新计算一遍 \(dp\) 数组,而每一次的修改都是单点的,因此可以考虑以此为突破口。事实上,这类题目具有区间性,也就是说可以用线段树优化dp。每次单独拎出一个区间 \([l,r]\),都是可以根据子区间的信息计算的,类似于区间dp。
我们考虑在线段树每个点上存两个信息,\(f_i\) 表示 \([l,r]\) 区间内有 \(i\) 个人买彩色画的方案数,\(all\)表示该区间总的方案数。然后思考如何更新。对于 \(f_{p,i}\),我们可以用 \(f_{ls_p,j}+f_{rs_p,i-j}\) 更新,\(all\) 用乘法更新,这样每次修改都是针对单点的,询问也只用根节点信息,完成了优化。
\(Code\),这类题目应该要求掌握。
\(E\) 题更类似思维题,贴一下题意和代码,可以自己结合着看一下。