没有笔记本时的刷题记录

机房电脑键盘和输入法都很难用,可能笔误很多。

P4244 [SHOI2008]仙人掌图 II

link

考虑类比 DP 求树的直径,我们需要特殊处理的是每个环内的两点产生的贡献。

如果我们得到了环上每个点 \(u\)\(f(u)\) 表示 \(u\) 在环外伸出的最长链长度,那么可以断环为链,做一个 DP,

\[\mathrm{ans}\leftarrow f(a_i)+f(a_j)+i-j\tag{$i-j\le\frac{\text{环长}}{2}$} \]

可以通过单调队列优化。

整体来说,我们在仙人掌上跑 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)\)

code

P5336 [THUSC2016]成绩单

link

考虑做区间 DP。

假如我们设 \(f(l,r)\) 表示区间 \([l,r]\) 被发放的最小代价,发现这样是难以转移的,需要由若干个不交的子区间转移而来,代价也难以计算。

在一个区间上选取若干个不交的子区间计算代价的话,我们不如做一个序列 DP。我们只关心没有被选的点中的最大和最小值,用于计算贡献。那么每次对于一个 \(i\) 点,考虑它不选,或是作为选择的区间的最后一位,转移为:

\[f(i,j,\max(u,a_j),\min(d,a_j))\gets f(i,j-1,u,d) \]

\[f(i,j,u,d)\gets f(i,k,u,d)+g(k+1,j) \]

其中 \(g(i,j)\) 表示 \([i,j]\) 最小的 \(f(i,j,u,d)\)

复杂度 \(\mathcal O(n^5)\)

code

P3262 [JLOI2015]战争调度

link

叶子的贡献依赖于祖先的状态,可以暴力去枚举这个状态,然后每个点以子树大小做一个背包。

计算复杂度,每个深度为 \(d\) 的点有 \(2^{d-1}\) 个祖先状态,对两个儿子合并背包复杂的为 \((2^{n-d})^2\),这样的点有 \(2^{d-1}\) 个。所以 \(n\) 层求和,总复杂度 \(\mathcal O(n2^{2n-2})\)

code

P4056 [JSOI2009]火星藏宝图

link

对于每一列斜率优化可以做到 \(\mathcal O(nm)\),但还不够。

观察到每一列一定是选行编号最大的最优,在当前行做斜率优化就好了,复杂度 \(\mathcal O(m^2)\)

注意要维护的是上凸壳。

code

P3572 [POI2014]PTA-Little Bird

link

口胡

看起来似乎可以单调队列,但是有“位置、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

link

首先是一个贪心策略。 如果是价格较贵的我们会选择只充到恰好能到下一个站,如果价格较为便宜一定是充满更优。由于容量的限制,我们有连续至多一个的站会是油量非满非空的,如果有连续两个,可以在较为便宜的点多充来调整。

那么只考虑每个点油空和油满两个关键状态。设 \(f(t,u,0/1)\) 来表示充 \(t\)\(u\) 点油空 / 油满的最小代价,有几种转移:

\[\begin{aligned} f(t+1,u,1)&\gets f(t,u,0)+V_u\times W\\ f(t+1,v,0)&\gets f(t,u,0)+V_u\times \mathrm{dis}(u,v)\\ f(t+1,v,1)&\gets f(t,u,1)+V_v\times \mathrm{dis}(u,v)\\ f(t+1,v,0)&\gets f(t,u,1)+\text{something} \end{aligned} \]

最后一种转移就是考虑油量非满非空的中间点,预处理一下。

复杂度 \(\mathcal O(\Delta\cdot n^2)\)

code

P4357 [CQOI2016]K 远点对

link

KD-Tree 暴力,拿个堆维护最远的 \(2k\) 个(有序)点对。

code

P4631 [APIO2018] Circle selection 选圆圈

link

好难啊,写个 KDT 跑路吧。

我们把圆用矩形框住,KDT 子树里维护最大矩形,判断矩形之间是否有交来剪枝。

然后可能会在 UOJ 被卡 TLE,考虑将所有点整体随机旋转某个角度。

然后被卡精度,要用 long double,并且 \(\varepsilon\) 不要设的太小,\(10^{-6}\) 就行。

code

posted @ 2021-07-06 21:55  RenaMoe  阅读(130)  评论(3)    收藏  举报