时间安排
8:00~8:40
T1看上去很友善,就直接写了个树背包,写的途中突然意识到合并是k^2的,过不掉。
于是只有40pts
8:40~9:20
这个题怎么看都像0/1分数规划,二分之后枚举中位数可以做到
O
(
n
2
l
o
g
n
)
O(n^2logn)
O(n2logn)
写完了之后发现怎么都过不掉样例,检查了一下发现中间有一个式子推错了。
9:20~10:00
改完之后发现枚举的中位数具有单调性,因此直接双指针扫一下,复杂度
O
(
n
l
o
g
2
n
)
O(nlog^2n)
O(nlog2n)
测了一下极限数据发现要2s,想了想发现并不会卡常,于是就先交了。
10:00~10:30
T1的链可以枚举区间端点做到 O ( n 3 k ) O(n^3k) O(n3k),可以过这一档
10:30~10:50
写T2的暴力
10:50~11:40
分析T2的特殊性质,subtask4似乎最好写,每个1的变化情况就是从某一时刻开始往右走,然后一直走,直到右边都是1结束,也就是说移动是一个区间,一开始想用平衡树/树套树维护这个东西,但是发现根本不会写,就放弃了。
考后总结
T1
首先,根本没有想到可以点分治/链分治
其次,一直在想怎么把背包合并的复杂度降下来,其实这种套路之前也见过很多次了,比如BZOJ4182 Shopping
,就是在
O
(
n
m
)
O(nm)
O(nm)的时间复杂度内解决树上依赖背包问题,思路也就是父亲和儿子公用一个背包数组,然后父亲的背包值可以直接从儿子继承,同时点分治过后,当考虑到某个子树时,可能与它相连的点一定是它的分治树上的祖先,可以在状压一下记录每个祖先是否选了。
下次再遇到树上背包一定要往这个方面想。
T3
可能是这种求最大平均数/中位数的题做多了,一看到这种问题就想0/1分数规划,根本没有分析原问题的性质。
只能说虽然套路做多了可以省掉很大一部分思考的时间,但是也很容易执着的认为就是这个套路,越陷越深,反而是题目本身就有特殊性质,直接做的复杂度更优秀。
越发觉得思维能力不够了,还是应该多做一些思维性的题啊。