20210825K 复盘

看题,看 t1 发现这显然是个树形 dp,对于每个点分为两种,回来和不回来,分别转移即可

看 t2,发现这题比较古怪。是不是可以把 P 分解出来分数维护?有一种不知道能不能过的做法...

看 t3,发现比较鬼...

看 t4,哦?我第一遍跑最大生成树,第二遍跑最小生成树,就行了?

写完了,希望没锅


s2oj778. A.餐馆 (dostavljac)

树形 dp,设 \(f[u][i]\) 表示,从点 \(u\) 出发,走不超过 \(i\) 的时间,最后走回来的最大得分

\(g[u][i]\) 表示,从点 \(u\) 出发,走不超过 \(i\) 的时间,最后不走回来的最大得分。

最后答案取 \(\max(f[1][m],\ g[1][m])\)。转移过程简单分下类就行

s2oj779. B.区间 (range)

因为不一定存在逆元,所以我们发现这个乘积是不具有可减性,只具有可加性的。所以尝试用一段去拼出来每一个长为 \(k\) 的段:将原序列划分为 \(k\) 长度一段,然后每一段处理出前缀和后缀乘积,两段拼起来就行了

没想到啊。

s2oj780. C.随机 (random)

ywk 做法

将序列上的每个数看成是二维平面上的点:\((i,\ s[i])\),然后我们发现答案其实就是问平面上的最小切比雪夫距离点对

切比雪夫距离定义为 \(\max(|x_i - x_j|,\ |y_i - y_j|)\)

根据经典公式我们切比雪夫距离转换为曼哈顿距离:\((x,\ y)\rightarrow ((x+y)/2,\ (x-y)/2)\)

所以现在的问题就变成了:如何找到平面上最近的曼哈顿距离对。

虽然常见平面最近点对经典用 kdt 做,但是由于现在的问题可以离线,并且无修改,所以考虑这样一种做法:首先所有点按照 \(x\) 排序,然后顺次加入。设当前加入的点编号为 \(i\),考虑 \(j<i\) 的点 \(j\),一定有 \(x_j<x_i\),我们再对 \(y\) 进行分类讨论,若 \(y_j<y_i\),那么 \(i\rightarrow j\) 之间的曼哈顿距离就是 \((x_i - x_j) + (y_i - y_j)\),对于所有满足上述约束的 \(j\) 我们希望求 \(\min\{(x_i - x_j)+ (y_ i - y_j)\}\),对其作变形:

\[\min\{(x_i - x_j)+ (y_i - y_j)\}\\ = x_i + y_i + \min\{-x_j - y_j\}\\ = x_i + y_i - \max\{x_j + y_j\} \]

此时 \(i,\ j\) 分离。

另一种情况:假如 \(y_j > y_i\),那么 \(i\rightarrow j\) 之间的曼哈顿距离就是:\((x_i - x_j)+(y_j - y_i)\)。如法炮制,得到我们要求的

\[x_i - y_i - \max\{x_j - y_j\} \]

好的,那么我们开两棵线段树,在加入一个点的时候,在 \(y_i\) 位置,第一棵树上取 max 插入 \(x_i + y_i\),在第二棵树上取 max 插入 \(x_i - y_i\)。查询就直接查

难写,但是思路很具有启发性


std 做法

考虑这样一个事实:如果我们已有了一个区间,那么把区间拉长,\(\min\{|s_i - s_j|\}\) 这个值会不断倾向变小,而 \(m\) 不断倾向变大,所以我们其实需要找到两者之间的平衡点。

于是维护一个双指针,在 \(m\) 较小的时候扩展右端点,在 \(\min\{|s_i - s_j|\}\) 的时候扩展左端点,过程中不断更新 ans 即可

好像很对的样子,但是不会证明

好写,并且代码实现很具有启发性。

s2oj783. D.遨游(trip)

考场上想到的更简单的做法:

首先把每条边的优惠之后边权求出来,记 \(e.L = \text{floor}(w)\)\(e.R = \text{ceil}(w)\),表示 \(L\)\(e.L\) 及之下,\(R\)\(e.R\) 及之上的情况下该边才能免费。

\(L\) 是第一关键字,所以考虑 \(L\)\(s-t\) 之间可能的最大的那个最小 \(L\) 一定在 \(L\) 的最大生成树上,所以先做 \(L\) 的最大生成树。得到 \(s-t\) 的瓶颈 \(L\) 值:不可能有一条 \(s-t\) 的路径使得最小 \(L\) 大于这个数了

然后把所有 \(L\) 小于这个瓶颈的边删掉。剩下的边构成的图中,任意一条 \(s-t\) 路径的最小 \(L\) 值一定是这个瓶颈。

然后我们希望 \(R\) 尽可能小。那么 \(s-t\) 之间可能的最小的那个最大值一定在 \(R\) 的最小生成树上,再跑一遍 \(R\) 的最小生成树即可

posted @ 2021-08-25 18:51  熹圜  阅读(21)  评论(0)    收藏  举报