#P16482. [Ural1670]Asterisk星号运算

[Ural1670]Asterisk星号运算

题目背景

最近,奇妙国的数学家发明了一种作用于序列的二元运算“星号” *

若两个序列分别为 AABB,则

AB=B+A,A*B=B+A,

其中 ++ 表示把两个序列首尾连接。也就是说,星号运算会把第二个序列放在前面,第一个序列放在后面

例如:

(2,4)(1,3)=(1,3,2,4).(2,4)*(1,3)=(1,3,2,4).

在没有额外括号时,同一表达式中的星号运算从左到右进行;括号中的运算优先执行。例如:

(3)((1,5)(2,7))=(2,7,1,5,3).(3)*((1,5)*(2,7))=(2,7,1,5,3).

如果一个序列元素本身是一个表达式,则先计算该表达式,再去掉嵌套序列的括号并展开。例如:

(1,((2)(3)),4)=(1,(3,2),4)=(1,3,2,4).(1,((2)*(3)),4)=(1,(3,2),4)=(1,3,2,4).

题目描述

给定一个 1N1\sim N 的排列 PP

你需要从按升序书写的数字

1,2,,N1,2,\ldots,N

出发,只添加圆括号 ()、逗号 , 和星号 *,构造一个合法表达式,使其计算结果恰好为排列 PP

注意:表达式中数字 1,2,,N1,2,\ldots,N 必须各出现一次,并且在表达式文本中必须按严格升序出现。

合法表达式的形式定义如下:

<expression>       ::= <sequence>[*<sequence>...]
<sequence>         ::= (<sequence element>[,<sequence element>...])
<sequence element> ::= <number> | <expression>
<number>           ::= 1|2|...|N

如果不存在满足要求的表达式,请输出 IMPOSSIBLE

输入格式

第一行包含一个整数 NN

第二行包含 NN 个整数 p1,p2,,pNp_1,p_2,\ldots,p_N,表示目标排列。

输出格式

输出一行。

  • 如果存在合法构造,输出任意一个满足要求的表达式;
  • 否则输出 IMPOSSIBLE

输出的表达式还必须满足:

  1. 不包含空格;
  2. 所有序列都必须写在圆括号中;
  3. 表达式长度不超过 100000100000 个字符;
  4. 数字 1,2,,N1,2,\ldots,N 在表达式中各出现一次,并按升序出现。

本题使用特殊判题。满足所有要求的任意表达式均可通过。

样例 1

4
3 4 2 1
(1)*(2)*(3,4)

样例 2

6
5 1 2 6 4 3
IMPOSSIBLE

样例说明

样例 1 中:

(1)(2)=(2,1),(1)*(2)=(2,1),

继续从左到右计算:

(2,1)(3,4)=(3,4,2,1).(2,1)*(3,4)=(3,4,2,1).

数据范围

1N10000.1\le N\le 10000.

输入保证 p1,p2,,pNp_1,p_2,\ldots,p_N1N1\sim N 的一个排列。

时间与空间限制

  • 时间限制:2 s2\text{ s}
  • 空间限制:256 MB256\text{ MB}