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\) 步。
则有:
接着发现第三维 \(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\) 表示该小朋友原来的位置,则有:
结束。

浙公网安备 33010602011771号