选择元素
- 难度 入门
- 时限 1s
- 空限 256m
- 线性DP
数据规模:,,。
思路
每个位置只有两个选择,且位置 是否合法只取决于位置 选了哪个数,是典型的线性 DP。
状态定义: 表示位置 选择 时,前 个位置是否存在合法方案; 同理表示选择 。初值 。
转移方程:
即:当前选某个数,当且仅当上一个位置至少存在一种可行选择,且与它的差不超过 。
答案: ,任一为真输出 Yes,否则输出 No。
每个位置只有两个布尔状态,滚动维护即可。
复杂度
时间 ,额外空间 。
仓颉实现
查看仓颉实现
import std.convert.*
import std.env.*
func abs64(x: Int64): Int64 {
if (x < 0) {
return -x
}
return x
}
main() {
let reader = getStdIn()
let first = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let n = first[0]
let k = first[1]
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let b = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
var okA = true
var okB = true
for (i in 1..n) {
let na = (okA && abs64(a[i] - a[i - 1]) <= k) || (okB && abs64(a[i] - b[i - 1]) <= k)
let nb = (okA && abs64(b[i] - a[i - 1]) <= k) || (okB && abs64(b[i] - b[i - 1]) <= k)
okA = na
okB = nb
}
if (okA || okB) {
println("Yes")
} else {
println("No")
}
}