CF1253B Silly Mistake
题目描述
中央公司拥有一个配备先进安保系统的办公室。有 $10^6$ 名员工,编号从 $1$ 到 $10^6$。
安保系统会记录员工的进出。第 $i$ 位员工进入办公室的事件用整数 $i$ 表示,离开办公室的事件用整数 $-i$ 表示。
公司对进出办公室有如下严格规定:
- 每位员工每天最多只能进入办公室一次。
- 显然,如果员工当天未进入办公室,则不能离开办公室。
- 每天的开始和结束时,办公室都是空的(员工不能在办公室过夜)。在一天中的任何时刻,办公室也可能是空的。
任何满足上述条件的事件序列都称为“有效的一天”。
以下是一些有效或无效的天的示例:
- $[1, 7, -7, 3, -1, -3]$ 是有效的一天($1$ 进入,$7$ 进入,$7$ 离开,$3$ 进入,$1$ 离开,$3$ 离开)。
- $[2, -2, 3, -3]$ 也是有效的一天。
- $[2, 5, -5, 5, -5, -2]$ 不是有效的一天,因为 $5$ 在同一天进入了两次办公室。
- $[-4, 4]$ 不是有效的一天,因为 $4$ 离开时并未在办公室内。
- $[4]$ 不是有效的一天,因为 $4$ 进入后在当天结束前未离开。
现在有 $n$ 个事件 $a_1, a_2, \ldots, a_n$,按发生顺序排列。这个序列对应于一个或多个连续的天。系统管理员不小心抹去了事件的日期,但事件的顺序未被更改。
你需要将事件序列 $a$ 划分为若干个连续的子数组,每个子数组必须表示一个非空的有效天(或者判断无法做到)。每个事件只能属于一个连续子数组。每个连续子数组都必须是一个有效的一天。
例如,如果 $n=8$,$a=[1, -1, 1, 2, -1, -2, 3, -3]$,那么可以将其划分为两个连续的有效天子数组:$a = [1, -1~\boldsymbol{|}~1, 2, -1, -2, 3, -3]$。
请帮助管理员将给定的事件序列 $a$ 按要求划分,或者报告无法划分。只需给出任意一种合法划分方式,无需最小化或最大化天数。
输入格式
第一行包含一个整数 $n$($1 \le n \le 10^5$)。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($-10^6 \le a_i \le 10^6$ 且 $a_i \neq 0$)。
输出格式
如果无法划分为有效的天,输出 $-1$。否则,输出任意一种有效划分方式,格式如下:
- 第一行输出天数 $d$($1 \le d \le n$)。
- 第二行输出 $d$ 个整数 $c_1, c_2, \ldots, c_d$($1 \le c_i \le n$ 且 $c_1 + c_2 + \ldots + c_d = n$),其中 $c_i$ 表示第 $i$ 天的事件数。
如果有多种有效方案,可以输出任意一种。无需最小化或最大化天数。
说明/提示
在第一个示例中,整个数组就是一个有效的一天。
在第二个示例中,一种可行的划分方式是 $[1, -1]$ 和 $[1, 2, -1, -2, 3, -3]$($d=2$,$c=[2, 6]$)。另一种有效划分是 $[1, -1]$、$[1, 2, -1, -2]$ 和 $[3, -3]$($d=3$,$c=[2, 4, 2]$)。两种方案均可接受。
在第三和第四个示例中,可以证明不存在有效方案。请注意,输入给定的数组不保证一定代表一组合理的事件。
由 ChatGPT 4.1 翻译