[R80A] 染色
数据规模
。答案不超过 ,用 64 位整数足够。
思路
左侧机器涂的是区间 ,右侧机器涂的是区间 。两段区间的交集长度为
即当 时两段不重叠,;否则重合 个方格。
把两台机器涂色的次数相加,得到 。其中恰好被一台机器涂色的方格被计了 次,被两台机器同时涂色的方格被计了 次。设恰好只被一台机器涂色的方格有 个,则
所以
也可以用「 减去不计入答案的方格」来理解,等价写法是 。当 时两段区间没有空隙,不计入答案的只有被两台机器同时涂色的 个;当 时两段区间不重叠,不计入答案的只有一台机器都没涂的 个。两种情况恰好合并成 。
复杂度
时间复杂度 ,空间复杂度 。
仓颉实现
import std.env.*
import std.convert.*
main() {
let reader = getStdIn()
let v = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let n = v[0]
let a = v[1]
let b = v[2]
var t: Int64 = a + b - n
if (t < 0) {
t = 0
}
println(a + b - 2 * t)
}