#L4278. 「KTSC 2022 R2」寻找魔法珠

「KTSC 2022 R2」寻找魔法珠


注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "marbles.h"


题目描述

题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사 T3 「마법 구슬 찾기」

你有 k+1k+1 颗外观和质量完全相同的珠子,其中 kk 颗是普通珠子,11 颗是魔法珠子。你需要找到这颗魔法珠子,才能进入魔法城堡。

虽然无法通过肉眼区分魔法珠子和普通珠子,但你可以使用 MM (M2)(M \geq 2) 个袋子来找到魔法珠子。袋子编号从 00M1M-1

找到魔法珠子的步骤如下:

  1. 将所有珠子分装到 MM 个袋子中。
    • 每个袋子里必须有珠子,不能有空袋子。
    • 袋子里只能装珠子,不能装其他袋子。
  2. 念咒语。
  3. 念咒语后:
    • 不含魔法珠子的袋子里的珠子会全部消失。
    • 含有魔法珠子的袋子里的珠子会因为魔法珠子的保护而不消失,但需要支付费用。若魔法珠子在第 ii 个袋子中,且该袋子里有 jj 颗珠子,则费用为 A[i]×j+B[i]A[i] \times j + B[i] (A[i]0,B[i]1)(A[i] \geq 0, B[i] \geq 1) 元。
  4. 魔法珠子永远不会消失,因此你可以重复上述步骤,直到只剩下魔法珠子。

你需要制定一个策略,将珠子分装到袋子中,以最小化在最坏情况下找到魔法珠子的费用。也就是说,无论哪颗珠子是魔法珠子,总费用不超过 ww 元,找出最小的 ww

请编写一个函数,解决 00N1N-1 的所有 kk 的问题。


实现细节

你需要实现以下函数:

vector<long long> find_minimum_costs(int N, vector<int> A, vector<int> B);
  • NN:珠子的最大数量
  • AA, BB:长度为 MM 的数组。对于每个 ii (0iM1)(0 \leq i \leq M-1),若魔法珠子在第 ii 个袋子中,且该袋子里有 jj 颗珠子,则费用为 A[i]×j+B[i]A[i] \times j + B[i] 元。
  • 该函数返回一个长度为 NN 的数组 CC。对于每个 kk (0kN1)(0 \leq k \leq N-1)C[k]C[k] 是在有 kk 颗普通珠子和 11 颗魔法珠子的情况下,找到魔法珠子的最坏情况下的最小费用(单位:元)。

注意,提交的代码中不应包含任何输入输出操作。


样例 1

考虑 N=3N=3, M=2M=2, A=[1,3]A=[1,3], B=[2,1]B=[2,1] 的情况。

评测程序将调用如下函数:

find_minimum_costs(3, {1,3}, {2, 1});
  • k=0k=0 时,只有一颗珠子,即魔法珠子,因此费用为 00 元。

  • k=1k=1 时,可以将两颗珠子分别放入两个袋子。若魔法珠子在第 00 个袋子中,费用为 A[0]×1+B[0]=1×1+2=3A[0] \times 1 + B[0] = 1 \times 1 + 2 = 3 元;若魔法珠子在第 11 个袋子中,费用为 A[1]×1+B[1]=3×1+1=4A[1] \times 1 + B[1] = 3 \times 1 + 1 = 4 元。因此,最坏情况下费用为 44 元。

  • k=2k=2 时,可以采用以下策略。假设三颗珠子分别为 XX, YY, ZZ

    1. XXZZ 放入第 00 个袋子,将 YY 放入第 11 个袋子,然后念咒语。
      • 若魔法珠子在第 00 个袋子中,费用为 A[0]×2+B[0]=1×2+2=4A[0] \times 2 + B[0] = 1 \times 2 + 2 = 4 元,剩下 XXZZ。然后将 ZZ 放入第 00 个袋子,将 XX 放入第 11 个袋子,再次念咒语。
        • 若魔法珠子在第 00 个袋子中,费用为 A[0]×1+B[0]=1×1+2=3A[0] \times 1 + B[0] = 1 \times 1 + 2 = 3 元,剩下 ZZ
        • 若魔法珠子在第 11 个袋子中,费用为 A[1]×1+B[1]=3×1+1=4A[1] \times 1 + B[1] = 3 \times 1 + 1 = 4 元,剩下 XX
      • 若魔法珠子在第 11 个袋子中,费用为 A[1]×1+B[1]=3×1+1=4A[1] \times 1 + B[1] = 3 \times 1 + 1 = 4 元,剩下 YY

    在这种策略下,若 XX 是魔法珠子,总费用为 4+4=84 + 4 = 8 元;若 YY 是魔法珠子,总费用为 44 元;若 ZZ 是魔法珠子,总费用为 4+3=74 + 3 = 7 元。因此,最坏情况下费用为 88 元。

函数应返回 [0,4,8][0, 4, 8]


样例 2

考虑 N=13N=13, M=2M=2, A=[1,3]A=[1,3], B=[2,1]B=[2,1] 的情况。

评测程序将调用如下函数:

find_minimum_costs(13, {1, 3}, {2, 1});

函数应返回 [0,4,8,11,13,17,18,20,24,25,27,29,30][0,4,8,11,13,17,18,20,24,25,27,29,30]


样例 3

考虑 N=12N=12, M=3M=3, A=[5,3,0]A=[5,3,0], B=[1,4,6]B=[1,4,6] 的情况。

评测程序将调用如下函数:

find_minimum_costs(12, {5, 3, 0}, {1, 4, 6});

函数应返回 [0,6,7,12,13,16,17,18,19,20,22,23][0, 6, 7, 12, 13, 16, 17, 18, 19, 20, 22, 23]


数据范围与提示

对于所有输入数据,满足:

  • 2N1062 \leq N \leq 10^6
  • 2M1052 \leq M \leq 10^5
  • 对于所有 ii (0iM1)(0 \leq i \leq M-1)0A[i]1090 \leq A[i] \leq 10^{9}
  • 对于所有 ii (0iM1)(0 \leq i \leq M-1)1B[i]1091 \leq B[i] \leq 10^{9}

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
1 3 A[0]=A[1]==A[M1]A[0]=A[1]=\cdots=A[M-1], B[0]=B[1]==B[M1]B[0]=B[1]=\cdots=B[M-1]
2 4 N5000N \leq 5000, M=2M=2
3 7 M=2M=2
4 12 对于所有 ii (0iM1)(0 \leq i \leq M-1)A[i]=0A[i]=0, B[i]1000B[i] \leq 1000
5 25 N10000N \leq 10000, M10M \leq 10
6 17 M100M \leq 100
7 32 无附加限制

示例评测程序

示例评测程序按以下格式读取输入:

第 1 行:N M
第 2+i (0 ≤ i ≤ M-1) 行:A[i] B[i]

示例评测程序的输出格式如下:

第 1+k (0 ≤ k ≤ N-1) 行:C[k]