atcoder#ARC138F. [ARC138F] KD Tree

[ARC138F] KD Tree

配点 : 10001000

問題文

平面上に NN 個の点があり,そのうち ii 番目 (1iN1 \leq i \leq N) の点は (i,Pi)(i,P_i) です. なお,(P1,P2,,PN)(P_1,P_2,\cdots,P_N)(1,2,,N)(1,2,\cdots,N) の順列になっています.

あなたは,空でない点の集合 ss に対し,整列という操作を行えます. 整列とは,以下のような再帰的な操作です.

  • ss に含まれる点がちょうど 11 個のとき,その点だけからなる列を作る.
  • ss に含まれる点が 22 個以上のとき,以下の 22 種類のうちどちらかの操作を行い,ss に含まれる点からなる列を作る.- 整数 xx を自由に選び,XX座標が xx 未満の点の集合(この集合を aa と呼ぶ)と,それ以外の点の集合(この集合を bb と呼ぶ)に分ける. ここで,aabb が空であってはならない. aa を整列してできた列の後ろに,bb を整列してできた列を連結し,新しい列を作る.
    • 整数 yy を自由に選び,YY座標が yy 未満の点の集合(この集合を aa と呼ぶ)と,それ以外の点の集合(この集合を bb と呼ぶ)に分ける. ここで,aabb が空であってはならない. aa を整列してできた列の後ろに,bb を整列してできた列を連結し,新しい列を作る.
  • 整数 xx を自由に選び,XX座標が xx 未満の点の集合(この集合を aa と呼ぶ)と,それ以外の点の集合(この集合を bb と呼ぶ)に分ける. ここで,aabb が空であってはならない. aa を整列してできた列の後ろに,bb を整列してできた列を連結し,新しい列を作る.
  • 整数 yy を自由に選び,YY座標が yy 未満の点の集合(この集合を aa と呼ぶ)と,それ以外の点の集合(この集合を bb と呼ぶ)に分ける. ここで,aabb が空であってはならない. aa を整列してできた列の後ろに,bb を整列してできた列を連結し,新しい列を作る.

点の集合 {(1,P1),(2,P2),,(N,PN)}\{(1,P_1),(2,P_2),\cdots,(N,P_N)\} に対して整列を行うとき,その結果としてありうる列の個数を 109+710^9+7 で割った余り求めてください.

制約

  • 1N301 \leq N \leq 30
  • (P1,P2,,PN)(P_1,P_2,\cdots,P_N)(1,2,,N)(1,2,\cdots,N) の順列
  • 入力される値はすべて整数である

入力

入力は以下の形式で標準入力から与えられる.

NN

P1P_1 P2P_2 \cdots PNP_N

出力

答えを出力せよ.

3
3 1 2
3

以下の 33 種類の列を得ることができます.

  • ((1,3),(2,1),(3,2))((1,3),(2,1),(3,2))
  • ((2,1),(3,2),(1,3))((2,1),(3,2),(1,3))
  • ((2,1),(1,3),(3,2))((2,1),(1,3),(3,2))

たとえば,((2,1),(1,3),(3,2))((2,1),(1,3),(3,2)) という列は,以下の手順で得られます.

  • 集合 {(1,3),(2,1),(3,2)}\{(1,3),(2,1),(3,2)\} に対して整列を行う.YY座標が 22 未満の点の集合 (={(2,1)}=\{(2,1)\}) とそれ以外の点の集合 (={(1,3),(3,2)}=\{(1,3),(3,2)\}) に分ける.- 集合 {(2,1)}\{(2,1)\} に対して整列を行う.列 ((2,1))((2,1)) を得る.
    • 集合 {(1,3),(3,2)}\{(1,3),(3,2)\} に対して整列を行う.XX座標が 33 未満の点の集合とそれ以外の点の集合に分ける.- {(1,3)}\{(1,3)\} に対して整列を行う.列 ((1,3))((1,3)) を得る.
    • {(3,2)}\{(3,2)\} に対して整列を行う.列 ((3,2))((3,2)) を得る.
    • 得られた 22 つの列を連結し,列 ((1,3),(3,2))((1,3),(3,2)) を得る.
    • 得られた 22 つの列を連結し,列 ((2,1),(1,3),(3,2))((2,1),(1,3),(3,2)) を得る.
  • 集合 {(2,1)}\{(2,1)\} に対して整列を行う.列 ((2,1))((2,1)) を得る.
  • 集合 {(1,3),(3,2)}\{(1,3),(3,2)\} に対して整列を行う.XX座標が 33 未満の点の集合とそれ以外の点の集合に分ける.
  • {(1,3)}\{(1,3)\} に対して整列を行う.列 ((1,3))((1,3)) を得る.
  • {(3,2)}\{(3,2)\} に対して整列を行う.列 ((3,2))((3,2)) を得る.
  • 得られた 22 つの列を連結し,列 ((1,3),(3,2))((1,3),(3,2)) を得る.
  • 得られた 22 つの列を連結し,列 ((2,1),(1,3),(3,2))((2,1),(1,3),(3,2)) を得る.
5
1 2 3 4 5
1
10
3 6 4 8 7 2 10 5 9 1
1332
30
7 11 8 26 4 13 28 5 14 1 16 27 10 2 23 25 17 6 3 18 24 15 9 22 21 29 12 20 19 30
641915679