没有笔记本时的刷题记录
机房电脑键盘和输入法都很难用,可能笔误很多。
P4244 [SHOI2008]仙人掌图 II
考虑类比 DP 求树的直径,我们需要特殊处理的是每个环内的两点产生的贡献。
如果我们得到了环上每个点 \(u\) 的 \(f(u)\) 表示 \(u\) 在环外伸出的最长链长度,那么可以断环为链,做一个 DP,
可以通过单调队列优化。
整体来说,我们在仙人掌上跑 Tarjan,对于当前的 \(u\),出边 \((u,v)\) 如果是割边,那么 \(f(u)\) 可以直接由 \(f(v)\) 转移而来;然后对于以 \(u\) 为根的每个环(\(\mathrm{dfn}(u)\) 最小)做上述的 DP,同时可以用环上的每个点更新 \(f(u)\)。
- 判断割边即是否 \(\mathrm{low}(v)>\mathrm{dfn}(u)\);
- 判断以 \(u\) 为根的环,可以记录每个点在 dfs 树上的父亲,判断是否 \(\mathrm{dfn}(v)>\mathrm{dfn}(u)\) 且 \(\mathrm{pre}(v)\neq u\)(dfs 树上 \(u\) 是 \(v\) 祖先但不是父亲)。
复杂的 \(\mathcal O(n)\)。
P5336 [THUSC2016]成绩单
考虑做区间 DP。
假如我们设 \(f(l,r)\) 表示区间 \([l,r]\) 被发放的最小代价,发现这样是难以转移的,需要由若干个不交的子区间转移而来,代价也难以计算。
在一个区间上选取若干个不交的子区间计算代价的话,我们不如做一个序列 DP。我们只关心没有被选的点中的最大和最小值,用于计算贡献。那么每次对于一个 \(i\) 点,考虑它不选,或是作为选择的区间的最后一位,转移为:
其中 \(g(i,j)\) 表示 \([i,j]\) 最小的 \(f(i,j,u,d)\)。
复杂度 \(\mathcal O(n^5)\)。
P3262 [JLOI2015]战争调度
叶子的贡献依赖于祖先的状态,可以暴力去枚举这个状态,然后每个点以子树大小做一个背包。
计算复杂度,每个深度为 \(d\) 的点有 \(2^{d-1}\) 个祖先状态,对两个儿子合并背包复杂的为 \((2^{n-d})^2\),这样的点有 \(2^{d-1}\) 个。所以 \(n\) 层求和,总复杂度 \(\mathcal O(n2^{2n-2})\)。
P4056 [JSOI2009]火星藏宝图
对于每一列斜率优化可以做到 \(\mathcal O(nm)\),但还不够。
观察到每一列一定是选行编号最大的最优,在当前行做斜率优化就好了,复杂度 \(\mathcal O(m^2)\)。
注意要维护的是上凸壳。
P3572 [POI2014]PTA-Little Bird
口胡:
看起来似乎可以单调队列,但是有“位置、DP 值、高度”三个属性。
但是先不要着急往数据结构优化方面想。观察高度对 DP 值的影响至多为 \(1\):
- 对于 \(i<j\) 且 \(f_i>f_j\),无论 \(i,j\) 的高度关系如何,\(i\) 都一定比 \(j\) 更优;
- 只有当 \(f_i=f_j\) 且 \(h_i<h_j\) 时,\(j\) 才可能更优。
也就是“高度”仅仅是 DP 值比较的第二关键字,只有 DP 值相等时才产生影响。
GYM102920D. Electric Vehicle
首先是一个贪心策略。 如果是价格较贵的我们会选择只充到恰好能到下一个站,如果价格较为便宜一定是充满更优。由于容量的限制,我们有连续至多一个的站会是油量非满非空的,如果有连续两个,可以在较为便宜的点多充来调整。
那么只考虑每个点油空和油满两个关键状态。设 \(f(t,u,0/1)\) 来表示充 \(t\) 次 \(u\) 点油空 / 油满的最小代价,有几种转移:
最后一种转移就是考虑油量非满非空的中间点,预处理一下。
复杂度 \(\mathcal O(\Delta\cdot n^2)\)。
P4357 [CQOI2016]K 远点对
KD-Tree 暴力,拿个堆维护最远的 \(2k\) 个(有序)点对。
P4631 [APIO2018] Circle selection 选圆圈
好难啊,写个 KDT 跑路吧。
我们把圆用矩形框住,KDT 子树里维护最大矩形,判断矩形之间是否有交来剪枝。
然后可能会在 UOJ 被卡 TLE,考虑将所有点整体随机旋转某个角度。
然后被卡精度,要用 long double,并且 \(\varepsilon\) 不要设的太小,\(10^{-6}\) 就行。

浙公网安备 33010602011771号