#P17270. [eJOI 2026] Increasing Split
[eJOI 2026] Increasing Split
题目描述
Boris 和 Ihor 找到了一个由 个正整数组成的序列 ,并想在两人之间分配这些数。由于无法就分配方案达成一致,他们请你担任仲裁者。
在作出任何决定之前,你可以看到整个序列。随后,你从左到右依次处理 的元素:先处理 ,再处理 ,直至 。处理每个元素时,你必须将它恰好交给 Boris 和 Ihor 中的一人。
两人都要求自己收到的元素按接收顺序构成严格递增序列。也就是说,交给某人的每个元素都必须严格大于此前交给他的最后一个元素。某人收到的第一个元素可以是任意值,也允许其中一人不收到任何元素。
对于从 到 的每个整数 ,请判断能否完成分配,使 Boris 恰好收到 个元素,并且两人得到的序列都严格递增。每个 都应视为一次相互独立的问题。
例如,令 。
- 当 时,将 、 和 交给 Boris,将 和 交给 Ihor。Boris 得到 ,Ihor 得到 ,两个序列都严格递增,因此 可行。
- 当 时,Boris 什么也得不到,Ihor 得到所有元素。Ihor 的序列以 开头,并非严格递增,因此 不可行。
在本例中,只有 和 可行。
实现细节
你需要实现以下函数:
std::vector<bool> increasing_split(std::vector<int> a)
- :由 个数组成的序列。
函数必须返回一个长度恰好为 的布尔数组。若可以进行分配,使 Boris 恰好收到 个元素且两个结果序列都严格递增,则下标 处的元素应为 true,否则为 false。每个测试中该函数恰好调用一次。
输入格式
输入格式:
- 第 行:一个整数 ;
- 第 行: 个整数 。
输出格式
若返回数组的长度不是 ,样例评测器会输出 WA: Returned array does not have size N+1。否则,它会输出一个长度为 的二进制串;若 可行,则下标 处的字符为 1,否则为 0。
5
3 1 4 5 5
001100
4
1 2 3 4
11111
提示
样例 1 解释
这里 。对于每个 :
- :不存在合法分配,答案为
0; - :不存在让 Boris 恰好收到一个元素的合法分配,答案为
0; - :将 和 交给 Boris,将 、 和 交给 Ihor。两个序列都严格递增,答案为
1; - :存在上文所述的合法分配,答案为
1; - 和 :不存在合法分配,答案均为
0。
样例 2 解释
这里 本身已经严格递增。无论如何分配,两人得到的序列都会严格递增。因此从 到 的每个 都可行。
限制
- 对每个 ,均有
子任务
| 子任务 | 分值 | 附加限制 | |
|---|---|---|---|
| 0 | - | 样例。 | |
| 1 | 10 | - | |
| 2 | 5 | 对每个 ,均有 。 | |
| 3 | 。 | ||
| 4 | 16 | 是 的一个排列。对于每个满足 的 ,前缀 是 的一个排列。 | |
| 5 | 21 | 是 的一个排列。对于每个满足 的 ,前缀 是 的一个排列。 | |
| 6 | 17 | ||
| 7 | 16 | - | |
| 8 | 10 | ||