[R79D] 分装
数据规模:,,。
思路
把 降序排序得到 ,把 降序排序得到 。由于 单调不减,,所以 降序排序后的第 项恰为 。
两个多重集合相等,当且仅当降序排序后逐项相等。 因此 合法当且仅当对每个位置 都有
(当 时只有左半边约束 ,右端视为 。)
每个位置给出一段关于 的整数区间, 段区间的交仍是一个区间。 取所有左端点的最大值与所有右端点的最小值(右端点再与 取最小):
合法容量恰好是满足 的整数,个数为 。全 的特殊性质也被自然覆盖:此时 、,即 的所有容量都合法。
复杂度
排序 ,扫描求交 ;额外空间 。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
import std.sort.*
main() {
let reader = getStdIn()
let nm = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let n = nm[0]
let m = nm[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) })
sort(a, descending: true)
sort(b, descending: true)
var lo: Int64 = 0
var hi: Int64 = m
for (i in 0..n) {
let x = a[i] / (b[i] + 1)
if (x > lo) {
lo = x
}
if (b[i] >= 1) {
let y = a[i] / b[i]
if (y < hi) {
hi = y
}
}
}
var ans = hi - lo
if (ans < 0) {
ans = 0
}
println(ans)
}