2.25 校内模拟赛 题解

博客园食用

好消息:签到题首杀。

坏消息:只会签到题。


\(\text{contest id: 726}\)

A. 随机

\(\text{problem id: 2307}\)

正解是 \(\text{multiset}\),但是数据太水赛时被暴力草过去了。

现在还不会,先咕着吧。

B. 回文路径

\(\text{problem id: 3772}\)

成功首杀。

看到回文,首先想到可以从起点和终点同时开始跳,这样就有一个四维 \(\text{dp}\),即 \(dp_{i,j,k,l}\) 表示从起点开始跳的点当前在坐标 \((i,j)\),另一个点在 \((k,l)\),但很显然时间爆表。

注意到只可以往下或右跳,那么一旦我们知道当前跳的步数 \(stp\) 以及所在的行数 \(i\),自然也可以求出所在的列数 \(j\)

这时候就简化为一个三维 \(\text{dp}\)\(dp_{i,j,stp}\) 表示第一个点在 \(i\) 行,第二个点在 \(j\) 行,它们跳了 \(stp\) 步。

则有:

\[dp_{i,j,stp}=dp_{i-1,j,stp-1}+dp_{i,j+1,stp-1}+dp_{i-1,j+1,stp-1}+dp_{i,j,stp-1} \]

接着发现第三维 \(stp\) 永远只和 \(stp-1\) 有关系,那么滚动数组压掉一维,结束。

闲话:这题赛时过了,然后发现没有特判 \(s_{1,1}\)\(s_{n,n}\) 不相等的情况,自己造了个数据把自己卡了。

C. 砍木头

\(\text{problem id: 3782}\)

\(\text{set}\) 暴力居然能过,离谱。

\(\text{set}\) 维护每一条线段的端点,碰见操作一就断开,在 \(\text{set}\) 内加入端点为 \(x\) 的线段。操作二就查找第一个大于 \(x\) 的线段,求出这一条线段与第一个小于这条线段的线段的差即可。

D. 排队

\(\text{problem id: 3783}\)

区间 \(\text{dp}\)

首先是显而易见的贪心,先选择价值小的人去排,然后再从小往大扩展。

\(dp_{i,j}\) 为使用 \(a_1\)\(a_{j-i+1}\) 填满 \([i,j]\) 这个区间的最大贡献。记 \(id_i\) 表示该小朋友原来的位置,则有:

\[dp_{i,j}=\max(dp_{i+1,j}+a_{j-i+1} \times |id_{j-i+1}-i|,dp_{i,j-1}+a_{j-i+1} \times |id_{j-i+1}-j|) \]

结束。

posted @ 2023-02-25 11:24  yizhixiaoyun  阅读(36)  评论(0)    收藏  举报