DFS + 剪枝
原题链接:传送门
CF C题
题目大意:
有 2n 个基地,其中 k 个基地是有复仇者的,问把 1 - 2n 个基地都摧毁需要最小的代价。
摧毁一段区间的地基可以选择直接摧毁,代价是 A * na * l , A 题目会直接告诉你, na 区间内存在复仇者的数量,l 是区间长度;或者你也可以把这个大区间平均分成两半, 仍然按之前的方法计算, 然后如果小区间不存在复仇者, 那么摧毁这段的代价直接为 B。
数据范围 :
n (1 ≤ n ≤ 30)
k (1 ≤ k ≤ 105)
A, B ( 1 ≤ A, B ≤ 104)
题解:
这个模型是不是很像线段树,可是 2n 太大了。
如果先不考虑其他操作的代价, 把所有的小区间汇聚在一起时间复杂度 O(2n log(2n))。
这样显然不行, 数据范围中给的 k 才 105,所以很明显是和 k 有关。因为不难发现其实很多区间根本不需要计算代价, 因为很多区间不存在复仇者。
所以 DFS + 剪枝 时间复杂度为 O(k log(k))。
每一段区间的人数也不能前缀和计算, 因为 2n 太大了。 所以可以二分区间查找有多少复仇者。 总是时间复杂度还得加上二分的开销。
Code block
1 |
|