#IOI20221A. 鲶鱼塘
鲶鱼塘
题目背景
Bu Dengklek 有一个鲶鱼塘。这个鲶鱼塘是由 个网格单元构成的池塘。每个单元都是相同大小的正方形。网格各列自西向东编号为从 到 ,各行自南向北编号为从 到 。我们把坐落在网格第 列第 行处(,)的单元记为单元 。
池塘里总共有 条鲶鱼,编号为从 到 ,分别位于不同的单元中。对每个满足 的 ,鲶鱼 在单元 中,其重量为 克。
题目描述
Bu Dengklek 想造些长堤来抓鲶鱼。在第 列长度为 的长堤(对于所有 和 ),是一个从第 行跨到第 行的矩形,盖住单元 。对于每一列,Bu Dengklek 可以按照她自己选择的某个长度造长堤,也可以不造。
鲶鱼 (对所有满足 的 )能被抓住,如果有某个长堤紧邻它的西侧或东侧,而且没有长堤盖住它所在的单元;也就是说,如果
- 单元 或 中至少有一个被某个长堤盖住,而且
- 没有长堤盖住单元 。
Bu Dengklek 希望造出来的长堤能让被抓住的鲶鱼的总重量尽量大。你的任务是求出 Bu Dengklek 通过造长堤能抓住的鲶鱼的最大总重量。
实现细节
你需要实现下面的函数:
long long max_weights(int N, int M, int[] X, int[] Y, int[] W)
- :池塘的尺寸。
- :鲶鱼的数量。
- :长度为 的两个数组,给出鲶鱼的位置。
- :长度为 的数组,给出鲶鱼的重量。
- 该函数需要返回一个整数,表示 Bu Dengklek 通过造长堤能抓住的鲶鱼的最大总重量。
- 该函数将被恰好调用一次。
5 4
0 2 5
1 1 2
4 4 1
3 3 3
8
样例解释
考虑如下调用:
max_weights(5, 4, [0, 1, 4, 3], [2, 1, 4, 3], [5, 2, 1, 3])
例如,考虑尺寸为 ,有 条鲶鱼的池塘:
- 鲶鱼 在单元 中,重量为 克。
- 鲶鱼 在单元 中,重量为 克。
- 鲶鱼 在单元 中,重量为 克。
- 鲶鱼 在单元 中,重量为 克。
Bu Dengklek 可以这样来造长堤:
造长堤前 | 造长堤后 |
---|---|
单元中的数字表示该单元中鲶鱼的重量。阴影单元被长堤盖住。在该场景中,鲶鱼 (在单元 中)和鲶鱼 (在单元 中)能被抓住。鲶鱼 (在单元 中)没被抓住,因为有一个长堤盖住了它所在的单元;鲶鱼 (在单元 中)没被抓住,因为没有长堤紧邻它的西侧或东侧。
在造完所述的长堤后,Bu Dengklek 能抓住鲶鱼 和 ,其总重量为 克。因为无法造出能够抓住总重量超过 克的鲶鱼的长堤,函数应当返回 。
约束条件
- ,(对所有满足 的 )
- (对所有满足 的 )
- 任意两条鲶鱼都不会在同一单元中。换句话说, 或 (对所有满足 的 和 )。
子任务
- (3 分) 是偶数(对所有满足 的 )
- (6 分)(对所有满足 的 )
- (9 分)(对所有满足 的 )
- (14 分),(对所有满足 的 )
- (21 分)
- (17 分)
- (14 分)在每列至多有 条鲶鱼。
- (16 分)没有额外限制。
评测程序示例
评测程序示例读取如下格式的输入:
- 第 行:
- 第 行:
评测程序示例将按照如下格式打印你的答案:
- 第 行:
max_weights
的返回值