AT_tenka1_2013_final_e 天下一折れ線遊戯

Description

[problemUrl]: https://atcoder.jp/contests/tenka1-2013-final/tasks/tenka1_2013_final_e $ x $ 座標の正の方向を右、$ y $ 座標の正の方向を上とします。 紙の上に、 - 左の方に $ N $ 個の赤い点 $ (0,\ 0),\ (0,\ 1000),\ ...,\ (0,\ 1000(N-1)) $ - 右の方に $ N $ 個の青い点 $ (10^9,\ 0),\ (10^9,\ 1000),\ ...,\ (10^9,\ 1000(N-1)) $ - $ M $ 個の黒い点 $ (X_k,\ Y_k) $ があります。黒い点の $ x $ 座標は全て異なります。 高橋くんは折れ線が大好きです。 それぞれの点 $ (x_k,\ y_k) $ について、 - 何もしない - $ x\ >\ x_k,\ y\ >\ y_k $の領域にある点の中で、 $ y $ 座標の値が最も小さい点と線分でつなぐ。そのような点が複数あるなら最も近い点と線分でつなぐ。そのような点がないなら何もしない。 - $ x\ >\ x_k,\ y\ の領域にある点の中で、\ y $ 座標の値が最も大きい点と線分でつなぐ。そのような点が複数あるなら最も近い点と線分でつなぐ。そのような点がないなら何もしない。 - $ x\ >\ x_k,\ y\ =\ y_k $の領域にある点の中で、最も近い点と線分でつなぐ。そのような点がないなら何もしない。 のどれか $ 1 $ つを行います。 高橋くんは、全ての赤い点に対して、折れ線でちょうど $ 1 $ つの青い点と結ばれるようにしたいです。 それぞれの折れ線は交わったり触れたりしてはいけません。また、 $ N $ 個の折れ線に含まれない無駄な線分を引いてもいけません。 $ N $ 個の折れ線の引き方は何通りあるかを mod $ 1000000007 $ で求めてください。 入力は、以下の形式で与えられる。 > $ N $ $ M $ $ X_1 $ $ Y_1 $ $ X_2 $ $ Y_2 $ : $ X_M $ $ Y_M $ 1. $ 1 $ 行目には、赤い点と青い点の数 $ N\ (1\ ≦\ N\ ≦\ 3) $ と、黒い点の数 $ M\ (0\ ≦\ M\ ≦\ 100000) $ が、 $ 1 $ 行で入力される 2. $ 2 $ 行目から $ M+1 $ 行までの $ M $ 行では、$ i $ 番目の黒い点の $ x $ 座標と $ y $ 座標を表す整数 $ X_i,\ Y_i\ (0\ が与えられる。 黒い点の\ x $ 座標は互いに異なります。つまり、$ i\ \neq\ j $ のとき、$ X_i\ \neq\ X_j $ を満たします。 - $ N\ =\ 1 $の入力に正解すると、$ 320 $ 点満点に対して部分点として $ 60 $ 点が与えられる。 - $ 0\ ≦\ M\ ≦\ 40 $ の入力に正解すると、$ 320 $ 点満点に対して部分点として上記とは別に $ 60 $ 点が与えられる。 高橋君が引くことが出来る、 $ N $ 個の折れ線の引き方は何通りあるかを、出力しなさい。もし組み合わせが $ 1000000007 $ 通り以上であった場合は、 $ 1000000007 $ で割った余りを出力しなさい。 また、出力の最後には改行をいれること。 ``` 2 2 100 100 110 110 ``` ``` 5 ``` $ (0,\ 0) $ が1つ目の赤い点(赤1)、$ (0,\ 1000) $ が2つ目の赤い点(赤2)、 $ (1000000000,\ 0) $ が1つ目の青い点(青1)、$ (1000000000,\ 1000) $ が2つ目の青い点(青2)、 $ (100,\ 100) $ が1つ目の黒い点(黒1)、$ (110,\ 110) $ が2つ目の黒い点(黒2)、と合計で $ 6 $ 個の点があります。 - 赤1から線分を引けるのは黒1または青1のみ、 - 赤2から線分を引けるのは黒2または青2のみ、 - 黒1から線分を引けるのは黒2または青1のみ、 - 黒2から線分を引けるのは青1または青2のみ となります。 交わったり、触れたりせずに折れ線を2個作るには - (赤1 - 黒1 - 黒2 - 青1、赤2 - 青2) - (赤1 - 黒1 - 青1、赤2 - 黒2 - 青2) - (赤1 - 黒1 - 青1、赤2 - 青2) - (赤1 - 青1、赤2 - 黒2 - 青2) - (赤1 - 青1、赤2 - 青2) と $ 5 $ 通りの方法があります。 ``` 1 3 500 800 300 500 400 400 ``` ``` 3 ``` $ (0,\ 0) $ が1つ目の赤い点(赤1)、 $ (1000000000,\ 0) $ が1つ目の青い点(青1)、 $ (500,\ 800) $ が1つ目の黒い点(黒1)、$ (300,\ 500) $ が2つ目の黒い点(黒2)、$ (400,\ 400) $ が3つ目の黒い点(黒3)と合計で $ 5 $ 個の点があります。 - 赤1から線分を引けるのは黒3または青1のみ、 - 黒1から線分を引けるのは青1のみ、 - 黒2から線分を引けるのは黒1または黒3のみ、 - 黒3から線分を引けるのは黒1または黒2のみ となります。 赤1と青1をつなぐ折れ線を作るには - (赤1 - 青1) - (赤1 - 黒3 - 青1) - (赤1 - 黒3 - 黒1 - 青1) と $ 3 $ 通りの方法があります。 ``` 2 2 1000 0 2000 1000 ``` ``` 1 ``` 赤い点を下から赤1、赤2、 青い点を下から青1、青2、 黒い点を入力で与えられた順番に黒1、黒2とします。 - (赤1 - 黒1 - 青1、赤2 - 黒2 - 青2) と $ 1 $ 通りの方法しかありません。 ``` 3 8 500 5000 3500 5000 2000 3500 1500 2000 2500 2000 1000 1000 3000 1000 1 1 ``` ``` 48 ``` ``` 3 0 ``` ``` 1 ``` それぞれの赤い点は、まっすぐ右にある青い点と結びます。 それぞれの折れ線は交差できないため、これ以外の引き方はありません。

Input Format

N/A

Output Format

N/A