AT_arc138_f [ARC138F] KD Tree
题目描述
平面上有 $N$ 个点,第 $i$ 个点($1\le i\le N$)为 $(i,P_i)$。其中 $(P_1,P_2,\cdots,P_N)$ 是 $(1,2,\cdots,N)$ 的一个排列。
你可以对一个非空点集 $s$ 执行**编排操作**。这是一个递归定义的操作:
- 如果 $s$ 中恰好只有一个点,那么对它执行编排操作会得到仅由这个点组成的序列。
- 如果 $s$ 中有两个或更多点,那么可以通过以下两种方式之一对它执行编排操作,得到一个由 $s$ 中所有点各出现一次组成的序列:
- 任选一个整数 $x$,将 $s$ 分成两部分:$X$ 坐标小于 $x$ 的点组成集合 $a$,其余点组成集合 $b$。要求 $a$ 和 $b$ 都非空。先对 $a$ 执行编排操作,再对 $b$ 执行编排操作,然后将 $a$ 得到的序列和 $b$ 得到的序列按 $a$ 在前、$b$ 在后的顺序拼接起来,形成一个序列。
- 任选一个整数 $y$,将 $s$ 分成两部分:$Y$ 坐标小于 $y$ 的点组成集合 $a$,其余点组成集合 $b$。要求 $a$ 和 $b$ 都非空。先对 $a$ 执行编排操作,再对 $b$ 执行编排操作,然后将 $a$ 得到的序列和 $b$ 得到的序列按 $a$ 在前、$b$ 在后的顺序拼接起来,形成一个序列。
求对点集 $\{(1,P_1),(2,P_2),\cdots,(N,P_N)\}$ 执行编排操作所能得到的不同序列的个数,对 $10^9+7$ 取模。
输入格式
输入按以下格式从标准输入给出:
> $N$
>
> $P_1$ $P_2$ $\cdots$ $P_N$
输出格式
一行一个整数,表示答案。
说明/提示
### 限制
- $1 \leq N \leq 30$
- $(P_1,P_2,\cdots,P_N)$ 是 $(1,2,\cdots,N)$ 的一个排列。
- 输入中的所有值均为整数。
### 样例解释 1
可以得到以下三个序列。
- $((1,3),(2,1),(3,2))$
- $((2,1),(3,2),(1,3))$
- $((2,1),(1,3),(3,2))$
例如,序列 $((2,1),(1,3),(3,2))$ 可以按如下方式得到。
- 对点集 $\{(1,3),(2,1),(3,2)\}$ 执行编排操作,将其分成 $Y$ 坐标小于 $2$ 的点集(即 $\{(2,1)\}$)和其余点集(即 $\{(1,3),(3,2)\}$)。
- 对点集 $\{(2,1)\}$ 执行编排操作,得到序列 $((2,1))$。
- 对点集 $\{(1,3),(3,2)\}$ 执行编排操作,将其分成 $X$ 坐标小于 $3$ 的点集和其余点集。
- 对点集 $\{(1,3)\}$ 执行编排操作,得到序列 $((1,3))$。
- 对点集 $\{(3,2)\}$ 执行编排操作,得到序列 $((3,2))$。
- 将得到的两个序列拼接起来,得到序列 $((1,3),(3,2))$。
- 将得到的两个序列拼接起来,得到序列 $((2,1),(1,3),(3,2))$。