题目背景
请使用 C++17 或 C++20 提交本题
你需要在程序开头加入如下代码:
#include <vector>
std::vector<int> testset(std::vector<int> A, std::vector<int> B, std::vector<int> L, std::vector<int> U);
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사 T1「 코딩 테스트 」
注:原题时间限制为 2.5s,但是洛谷评测机不给力,因此放宽至 3s。
题目描述
公司最近因为编程测试的流行,开始出一些编程测试题目并出售给 IT 公司。
为了方便,公司将题目的难度分为 0 到 N−1 个等级。目前,公司有 Ai 个难度为 i 级的题目,还有 Bi 个难度不确定是 i 级还是 i+1 级的题目。除此之外,没有其他难度的题目。
公司正在寻找愿意购买题目的企业。目前有 M 家企业表示有购买意向,编号从 0 到 M−1。第 j(0≤j≤M−1) 家企业只对难度在 Lj 级到 Uj 级之间的题目感兴趣。
公司计划将难度在 Lj 级到 Uj 级之间的题目按难度各选一个,组成一套题出售给第 j 家企业,我们称之为一场比赛。如果只向第 j 家企业出售题目,最多可以出售多少场比赛?对于难度不确定是 i 级还是 i+1 级的题目,需要适当分配难度,使得出售的比赛数量最多,并且每场比赛中的题目不能重复使用。
你需要实现以下函数:
vector<int> testset(vector<int> A, vector<int> B, vector<int> L, vector<int> U);
- 该函数只会被调用一次。
A
:长度为 N 的整数数组。对于每个 i(0≤i≤N−1),Ai 是难度为 i 级的题目数量。
B
:长度为 N−1 的整数数组。对于每个 i(0≤i≤N−2),Bi 是难度不确定是 i 级还是 i+1 级的题目数量。
L, U
:长度为 M 的整数数组。对于每个 j(0≤j≤M−1),Lj, Uj 分别是第 j 家企业感兴趣的题目的最小难度和最大难度。
- 该函数返回一个长度为 M 的整数数组 S。对于每个 j(0≤j≤M−1),Sj 是可以出售给第 j 家企业的比赛的最大数量。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 1 行:NM
- 第 2 行:A[0]A[1]⋯A[N−1]
- 第 3 行:B[0]B[1]⋯B[N−2]
- 第 4+j(0≤j≤M−1) 行:L[j]U[j]
输出格式
示例评测程序的输出格式如下:
- 第 1+j(0≤j≤M−1) 行:S[j]
4 2
2 3 1 1
1 3 2
0 3
1 2
3
5
提示
样例解释 #1
考虑 N=4,M=2,A=[2,3,1,1],B=[1,3,2],L=[0,1],U=[3,2] 的情况。
评测程序将调用如下函数:
testset({2,3,1,1},{1,3,2},{0,1},{3,2});
第 0 家企业需要难度在 0 级到 3 级之间的题目。可以通过以下方式组成 3 场比赛,剩下一个难度为 1 级的题目,无法再组成更多场比赛。
|
0 级 |
1 级 |
2 级 |
3 级 |
比赛 1 |
0 |
1 |
2 |
3 |
比赛 2 |
1−2 |
2−3 |
比赛 3 |
0−1 |
1−2 |
第 1 家企业需要难度在 1 级到 2 级之间的题目。可以通过以下方式组成 5 场比赛,使用了所有可能的题目,无法再组成更多的比赛。
|
1 级 |
2 级 |
比赛 1 |
1 |
2 |
比赛 2 |
1−2 |
比赛 3 |
1−2 |
比赛 4 |
0−1 |
2−3 |
比赛 5 |
1−2 |
因此,调用的 testset
函数应返回 S=[3,5]。
数据范围
对于所有输入数据,满足:
- 2≤N≤105
- 1≤M≤105
- 对于所有 i(0≤i≤N−1),0≤A[i]≤108
- 对于所有 i(0≤i≤N−2),0≤B[i]≤108
- 对于所有 i(0≤j≤M−1),0≤L[i]≤U[i]≤N−1
详细子任务附加限制及分值如下表所示。
Subtask |
分值 |
约束 |
1 |
3 |
$A[i] \leq 1000 (0 \leq i \leq N-1),B[i] \leq 1000 (0 \leq i \leq N-2),U[j]-L[j] \leq 2 (0 \leq j \leq M-1)$ |
2 |
15 |
M≤100 |
3 |
36 |
N≤5000 |
4 |
23 |
对于所有 j(0≤j≤M−1),L[j]=0 |
5 |
无附加限制 |