P11980 [KTSC 2021] 会议室 / meeting

题目背景

本题翻译自 [2021년도 국제정보올림피아드 대표학생 선발고사](https://www.ioikorea.or.kr/archives/ioitst/2021/) 2차 선발고사 [#2 회의실](https://assets.ioikorea.or.kr/ioitst/2021/2/meeting/meeting_statement.pdf)。 **请注意,你不需要也不应该实现 `main` 函数。具体实现方式见【实现细节】部分。** 提交时,请在程序开头添加如下内容,并且无需引用 `meeting.h`: ```cpp #include long long min_charge(int K, std::vector S, std::vector E, std::vector W); ```

题目描述

有 $K$ 个会议室。$N$ 个会议需要使用这些会议室。每个会议被赋予从 $1$ 到 $N$ 的编号。会议 $i$ 用开始时间 $s_i$、结束时间 $e_i$ 和违约金 $w_i$ 表示。 这些会议室按照非常特殊的规则运营。会议 $i$ 和会议 $j$ 如果满足以下至少一个条件,则称为相关会议: 1. 两个区间 $[s_i, e_i]$ 和 $[s_j, e_j]$ 有公共部分时(包括仅起点或终点接触的情况),$i$ 和 $j$ 是相关会议。 2. 两个区间 $[s_i, e_i]$ 和 $[s_j, e_j]$ 没有公共部分,但存在另一个会议 $c$ 与 $i$ 相关,且 $[s_c, e_c]$ 和 $[s_j, e_j]$ 有公共部分时(包括仅起点或终点接触的情况),$i$ 和 $j$ 是相关会议。 会议可能被取消,因此上述定义仅基于未被取消的会议判断。即,原本相关的两个会议可能因部分会议被取消而变得不相关。 未被取消的会议必须分配到一个会议室。相关会议必须分配到不同的会议室。例如,三个会议 $[1, 3], [3, 5], [5, 7]$中,尽管 $[1, 3]$ 和 $[5, 7]$ 没有公共部分,但仍需分配三个会议室。由于只有 $K$ 个会议室,可能需要取消部分会议。取消会议 $i$ 需支付违约金 $w_i$ ,因此需要精心选择取消的会议,使违约金总和最小。 下图展示了 $5$ 个会议 $[1, 4], [3, 6], [5, 8], [7, 10], [9, 12]$,违约金分别为 $1, 2, 5, 2, 1$ 的情况。假设有 $2$ 个会议室。左侧示例取消了 $[5, 8]$,违约金为 $5$;右侧示例取消了 $[3, 6]$ 和 $[9, 12]$,违约金为 $3$。所有情况中,最小违约金总和为 $3$。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2i45y1pr.png) ### 实现细节 需实现以下函数: ```cpp long long int min_charge(int K, vector S, vector E, vector W) ``` - 此函数仅被调用一次。 - $K$ 为会议室数量。 - $S, E, W$ 的长度均为 $N$。 - 会议 $i + 1$ 的开始时间为 $S[i]$,结束时间为 $E[i]$,违约金为 $W[i]$($0 \leq i \leq N - 1$)。 - 此函数需根据会议室数量和会议信息,找到满足条件的最小违约金总和并返回。 提交的源代码中不得调用任何输入输出函数。

输入格式

示例评测程序输入格式: - 第 $1$ 行: $N \ K$ - 第 $1 + i$ 行($1 \leq i \leq N$):$S[i - 1] \ E[i - 1] \ W[i - 1]$

输出格式

示例评测程序输出格式: - 第 $1$ 行:`min_charge` 函数返回值 实际评测程序可能与示例评测程序不同。

说明/提示

### 约束条件 - $1 \leq K \leq N$ - $1 \leq N \leq 2\,500$ - $1 \leq s_i \leq e_i \leq 10^9$($1 \leq i \leq N$) - $1 \leq w_i \leq 10^9$($1 \leq i \leq N$) ### 子任务 1. ($10$ 分) - $N \leq 16$ 2. ($17$ 分) - $K = 1$ 3. ($32$ 分) - 所有 $i$ 满足 $w_i = 1$ 4. ($26$ 分) - $N \leq 250$ 5. ($65$ 分) - 无额外约束。 ### 评分标准 `min_charge` 函数返回的违约金总和必须与正确答案一致。 各子任务得分为该子任务所有测试数据得分的最小值。 ### 示例 - $N = 5$,$K = 2$,$S = [1, 3, 5, 7, 9]$,$E = [4, 6, 8, 10, 12]$,$W = [1, 2, 5, 2, 1]$ 时,评测程序调用: ```cpp min_charge(2, [1, 3, 5, 7, 9], [4, 6, 8, 10, 12], [1, 2, 5, 2, 1]) ``` 根据题目描述中的示例,函数应返回 $3$。 请注意此示例不满足子任务 $2$ 和 $3$ 的约束条件。