#P16892. [EJOI 2026]Increasing Split

[EJOI 2026]Increasing Split

  • 比赛:EJOI 2026 Day 1
  • 时间限制:1.5 秒
  • 内存限制:1024 MiB
  • 题目类型:函数提交题

题目描述

Boris 和 Ihor 找到了一个由 NN 个正整数组成的序列

a0,a1,,aN1a_0,a_1,\dots,a_{N-1}

并希望把这些数分给两个人。

你事先可以看到完整序列。随后按从左到右的顺序依次处理 a0,a1,,aN1a_0,a_1,\dots,a_{N-1}。处理每个元素时,必须把它恰好分给 Boris 或 Ihor 中的一人。

两人都要求:自己收到的元素按照收到顺序必须构成一个严格递增序列

也就是说,每次分给某个人的新元素,都必须严格大于此前最后一次分给他的元素。一个人收到的第一个元素可以是任意值,也允许某个人一个元素都收不到。

对于每个整数 K=0,1,,NK=0,1,\dots,N,你需要独立判断:

是否存在一种划分,使 Boris 恰好收到 KK 个元素,并且 Boris 与 Ihor 各自收到的序列都严格递增?

各个 KK 之间相互独立,可以使用完全不同的划分方案。

例如 a=[3,1,4,5,5]a=[3,1,4,5,5]

  • K=3K=3 时,可以把 3,4,53,4,5 分给 Boris,把 1,51,5 分给 Ihor,因此可行;
  • K=0K=0 时,所有元素都必须给 Ihor,而序列从 3,13,1 开始,不严格递增,因此不可行。

该例中仅 K=2K=2K=3K=3 可行。

实现要求

实现:

std::vector<bool> increasing_split(std::vector<int> a);
  • a:长度为 NN 的输入序列。

返回一个长度恰好为 N+1N+1 的布尔数组。

ii 个元素为:

  • true:存在合法划分,使 Boris 恰好收到 ii 个元素;
  • false:不存在。

每个测试中该函数恰好调用一次。

数据范围

  • 2N41052\le N\le4\cdot10^5
  • 1ai1091\le a_i\le10^9

样例 1

Sample grader 输入

5
3 1 4 5 5

Sample grader 输出

001100

说明

  • K=0K=0:不可行;
  • K=1K=1:不可行;
  • K=2K=2:例如把 a1=1,a4=5a_1=1,a_4=5 给 Boris,把 a0=3,a2=4,a3=5a_0=3,a_2=4,a_3=5 给 Ihor,可行;
  • K=3K=3:可行;
  • K=4,5K=4,5:不可行。

样例 2

Sample grader 输入

4
1 2 3 4

Sample grader 输出

11111

序列本身严格递增,因此无论怎样把元素分给两个人,两人的子序列都仍严格递增。于是 K=0,1,2,3,4K=0,1,2,3,4 全部可行。

子任务

子任务 分值 NN 额外限制
0 - 样例
1 10 18\le18
2 5 4105\le4\cdot10^5 对所有 0i<N10\le i<N-1aiai+1a_i\le a_{i+1}
3 a0max(a1,a2,,aN1)a_0\ge\max(a_1,a_2,\dots,a_{N-1})
4 16 aa11NN 的排列;对任意满足 ai<ai+1a_i<a_{i+1}ii,前缀 a0,,aia_0,\dots,a_i 恰好是 11i+1i+1 的排列
5 21 5000\le5000 aa11NN 的排列;对任意满足 max(a0,,ai)<ai+1\max(a_0,\dots,a_i)<a_{i+1}ii,前缀 a0,,aia_0,\dots,a_i 恰好是 11i+1i+1 的排列
6 17 4105\le4\cdot10^5 与子任务 5 相同
7 16 5000\le5000
8 10 4105\le4\cdot10^5

Sample grader

输入:

  • 第一行一个整数 NN
  • 第二行 NN 个整数 a0,a1,,aN1a_0,a_1,\dots,a_{N-1}

若返回数组长度不是 N+1N+1,Sample grader 会判错。

否则输出一行长度为 N+1N+1 的二进制串:第 ii 位为 1 表示 K=iK=i 可行,否则为 0