#P11980. [KTSC 2021] 会议室 / meeting

[KTSC 2021] 会议室 / meeting

题目背景

本题翻译自 2021년도 국제정보올림피아드 대표학생 선발고사 2차 선발고사 #2 회의실

提交时,请在程序开头添加如下内容,并且无需引用 meeting.h

#include <vector>

long long min_charge(int K, std::vector<int> S, std::vector<int> E, std::vector<int> W);

题目描述

KK 个会议室。NN 个会议需要使用这些会议室。每个会议被赋予从 11NN 的编号。会议 ii 用开始时间 sis_i、结束时间 eie_i 和违约金 wiw_i 表示。

这些会议室按照非常特殊的规则运营。会议 ii 和会议 jj 如果满足以下至少一个条件,则称为相关会议:

  1. 两个区间 [si,ei][s_i, e_i][sj,ej][s_j, e_j] 有公共部分时(包括仅起点或终点接触的情况),iijj 是相关会议。
  2. 两个区间 [si,ei][s_i, e_i][sj,ej][s_j, e_j] 没有公共部分,但存在另一个会议 ccii 相关,且 [sc,ec][s_c, e_c][sj,ej][s_j, e_j] 有公共部分时(包括仅起点或终点接触的情况),iijj 是相关会议。

会议可能被取消,因此上述定义仅基于未被取消的会议判断。即,原本相关的两个会议可能因部分会议被取消而变得不相关。

未被取消的会议必须分配到一个会议室。相关会议必须分配到不同的会议室。例如,三个会议 [1,3],[3,5],[5,7][1, 3], [3, 5], [5, 7]中,尽管 [1,3][1, 3][5,7][5, 7] 没有公共部分,但仍需分配三个会议室。由于只有 KK 个会议室,可能需要取消部分会议。取消会议 ii 需支付违约金 wiw_i ,因此需要精心选择取消的会议,使违约金总和最小。

下图展示了 55 个会议 [1,4],[3,6],[5,8],[7,10],[9,12][1, 4], [3, 6], [5, 8], [7, 10], [9, 12],违约金分别为 1,2,5,2,11, 2, 5, 2, 1 的情况。假设有 22 个会议室。左侧示例取消了 [5,8][5, 8],违约金为 55;右侧示例取消了 [3,6][3, 6][9,12][9, 12],违约金为 33。所有情况中,最小违约金总和为 33

实现细节

需实现以下函数:

long long int min_charge(int K, vector<int> S, vector<int> E, vector<int> W)
  • 此函数仅被调用一次。
  • KK 为会议室数量。
  • S,E,WS, E, W 的长度均为 NN
  • 会议 i+1i + 1 的开始时间为 S[i]S[i],结束时间为 E[i]E[i],违约金为 W[i]W[i]0iN10 \leq i \leq N - 1)。
  • 此函数需根据会议室数量和会议信息,找到满足条件的最小违约金总和并返回。

提交的源代码中不得调用任何输入输出函数。

输入格式

示例评测程序输入格式:

  • 11 行: N KN \ K
  • 1+i1 + i 行(1iN1 \leq i \leq N):S[i1] E[i1] W[i1]S[i - 1] \ E[i - 1] \ W[i - 1]

输出格式

示例评测程序输出格式:

  • 11 行:min_charge 函数返回值

实际评测程序可能与示例评测程序不同。

5 2
1 4 1
3 6 2
5 8 5
7 10 2
9 12 1
3
5 1
2 6 5
4 6 2
8 8 5
1 3 4
6 8 7
12

提示

约束条件

  • 1KN1 \leq K \leq N
  • 1N25001 \leq N \leq 2\,500
  • 1siei1091 \leq s_i \leq e_i \leq 10^91iN1 \leq i \leq N
  • 1wi1091 \leq w_i \leq 10^91iN1 \leq i \leq N

子任务

  1. 1010 分)
    • N16N \leq 16
  2. 1717 分)
    • K=1K = 1
  3. 3232 分)
    • 所有 ii 满足 wi=1w_i = 1
  4. 2626 分)
    • N250N \leq 250
  5. 6565 分)
    • 无额外约束。

评分标准

min_charge 函数返回的违约金总和必须与正确答案一致。

各子任务得分为该子任务所有测试数据得分的最小值。

示例

  • N=5N = 5K=2K = 2S=[1,3,5,7,9]S = [1, 3, 5, 7, 9]E=[4,6,8,10,12]E = [4, 6, 8, 10, 12]W=[1,2,5,2,1]W = [1, 2, 5, 2, 1] 时,评测程序调用:

    min_charge(2, [1, 3, 5, 7, 9], [4, 6, 8, 10, 12], [1, 2, 5, 2, 1])
    

    根据题目描述中的示例,函数应返回 33

    请注意此示例不满足子任务 2233 的约束条件。