Logo Universal Online Judge

UOJ

时间限制:1 s 空间限制:512 MB
统计

xpp 想要送给他的 npy 一副扑克牌,这副扑克牌共有 $n$ 张,没有花色,点数分别为 $1, 2, \ldots, n$。

不幸的是,这幅扑克牌不小心在某次桌游过程中被洗乱了,为了展现自己的一手高超的洗牌技巧,xpp 打算使用如下方式洗牌。具体地,xpp 需要执行若干次以下操作:

  • 选定正整数 $1 \leq k \leq n$,取出牌堆中最上面 $k$ 张,作为整体翻转后扣在牌堆顶。

注意每张扑克牌都有正面和反面。例如,对 $n = 4$ 的情形,如果原先的 $4$ 张牌分别为 $\left( 2^+, 4^+, 3^-, 1^+ \right)$ (上标 $+$ 表示正面朝上,$-$ 表示反面朝上),选择 $k = 3$ 后牌堆变为 $\left( 3^+, 4^-, 2^-, 1^+ \right)$。

洗牌最终的目标是所有扑克牌均为正面朝上,且自顶向底分别为 $1, 2, \ldots, n$。

xpp 发现这样洗牌太浪费时间了,于是他找到了你,需要你帮他找一个步数尽量小的方案。

输入:

第一行包含一个正整数 $n$,表示这叠扑克牌中的扑克牌张数。

第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$,从上往下描述每一张扑克牌。其中 $|{a_i}|$ 表示 (从上往下) 第 $i$ 张扑克牌的点数,$a_i > 0$ 表示该扑克牌正面朝上,$a_i < 0$ 为反面朝上。
输出:

第一行包含一个非负整数 $m$ ($0 \leq m \leq 3 n$),表示操作的次数。

第二行包含 $m$ 个正整数 $k_1, k_2, \ldots, k_m$,按顺序表示每一步的 $k$ 值。

如果有多组合法的方案,输出任意一组均可。注意你的最终得分取决于 $m$ 的大小,具体详见{{ s('scoring')[3:] }}

{{ s('sample', 1) }}

{{ self.sample_text() }}

{{ self.title_sample_description() }}

注意你不需要最小化操作的总次数。根据{{ s('scoring')[3:] }},该输出可以获得总分的 $100 \%$。

{{ s('sample', 2) }}

{{ self.sample_file() }}

{{ s('scoring') }}

本题共 $10$ 个测试点,每个测试点满分 $10$ 分。每个测试点的得分通过如下方式计算:

  • 若你的输出格式错误,或无法正确完成洗牌,得 $0$ 分。
  • 否则,设 $k = m/n$。
    • 若 $k \leq 2$,则该测试点得 $10$ 分。
    • 若 $k \leq 2.2$,则该测试点得 $8$ 分。
    • 若 $k \leq 2.4$,则该测试点得 $7$ 分。
    • 若 $k \leq 2.7$,则该测试点得 $6$ 分。
    • 否则 ($k \leq 3$),该测试点得 $5$ 分。

{{ s('数据范围与提示') }}

{{ render(json.dumps('\leavevmode\hbox spread-4pt{'), 'tex') }} 对于所有的测试点,保证 $1 \leq n \leq 2000$,$|{a_1}|,|{a_2}|, \ldots,|{a_n}|$ 构成 $1, 2, \ldots, n$ 的一个排列。 {{ render(json.dumps('}'), 'tex') }}

具体的测试点的数据规模见下表:

{{ tbl('constraints', width = [0.25, 0.25, 0.25]) }}