AT_ahc071_a [AHC071A] Brick Cover

Background

高橋社長は、うっかり AtCoder 社のオフィスの壁にいくつもの穴をあけてしまった。 青木副社長に見つかる前に何とかしたい高橋社長は、壁の前にレンガを積んで穴を隠すことにした。 ただし、レンガを買いすぎると、その出費から青木副社長に怪しまれるかもしれない。 できるだけ少ない費用ですべての穴を隠せるよう、レンガの配置を考えてほしい。

Description

高さ $ H $ マス、幅 $ W $ マスの壁がある。 左下のマスの座標を $ (0,0) $ とし、そこから右方向に $ x $ マス、上方向に $ y $ マス進んだ先のマスの座標を $ (x,y) $ とする。 壁の最下段のすぐ下には床があり、 $ K $ 個の異なるマス $ (a_0,b_0),\ldots,(a_{K-1},b_{K-1}) $ に穴があいている。 あなたは、この壁の手前にレンガを積み上げ、すべての穴のあいたマスを覆いたい。 レンガは高さが $ 1 $ マスで、幅が $ 1,3,5,7,9 $ マスの $ 5 $ 種類あり、それぞれ何個でも使用できる。 幅 $ \ell $ のレンガ $ 1 $ 個の代金は $ c_\ell $ である。 レンガは回転させることができず、左下の座標を整数座標 $ (x,y) $ として配置すると、 $ (x,y),\ldots,(x+\ell-1,y) $ の $ \ell $ 個のマスを覆う。 各レンガは、底面の中央の $ 1 $ マスにある接続部を、床または直下のレンガに固定することで姿勢を保つ。 中央以外の部分が支えられている必要はなく、上に載るレンガの重さや重心は姿勢の維持に影響しない。 配置は、以下の条件をすべて満たさなければならない。 - 各レンガは壁内に収まる。 すなわち、左下の座標が $ (x,y) $ 、幅が $ \ell $ のレンガについて、 $ 0\leq x $ 、 $ x+\ell\leq W $ 、 $ 0\leq y

Input Format

入力は以下の形式で標準入力から与えられる。 > $ W $ $ H $ $ K $ $ c_1 $ $ c_3 $ $ c_5 $ $ c_7 $ $ c_9 $ $ a_0 $ $ b_0 $ $ \vdots $ $ a_{K-1} $ $ b_{K-1} $ 各値は以下の制約を満たす。 - $ W=60 $ - $ H=40 $ - $ K=120 $ - $ c_1=5 $ - $ 2\ell-1\leq c_\ell\leq 2\ell+4 $ ( $ \ell=3,5,7,9 $ ) - $ 0\leq a_j

Output Format

以下の形式で標準出力に出力せよ。 > $ M $ $ x_0 $ $ y_0 $ $ \ell_0 $ $ \vdots $ $ x_{M-1} $ $ y_{M-1} $ $ \ell_{M-1} $ ここで、 $ M $ は配置するレンガの個数であり、 $ M\leq WH $ を満たさなければならない。 最初の行に $ M $ を整数で出力し、続く $ M $ 行のうち $ i+1 $ 行目に、レンガ $ i $ の左下の座標 $ (x_i,y_i) $ と幅 $ \ell_i $ を整数で出力せよ。 $ \ell_i $ は $ 1,3,5,7,9 $ のいずれかでなければならない。 出力するレンガの順序は任意である。 実行時間制限内であれば、上記の形式の解を複数回出力してもよい。 複数回出力した場合、最後に出力された解のみが採点に用いられる。 各解は独立した完成配置を表し、先に出力した解へのレンガの追加を表すものではない。 Web版ビジュアライザでは、出力した複数の解を比較することができる。 [例を見る](https://img.atcoder.jp/ahc071/Wfu7FwbO.html?lang=ja&seed=0&output=sample)

Explanation/Hint

### 得点 使用するレンガの個数を $ M $ 、各レンガの幅を $ \ell_0,\ldots,\ell_{M-1} $ とし、費用 $ C $ を以下で定義する。 \\\[ C=\\sum\_{i=0}^{M-1}c\_{\\ell\_i} \\\] 壁全体を幅 $ 1 $ のレンガで覆うときの費用は $ WHc_1 $ である。 このとき、以下の得点が得られる。 \\\[ \\max(0,WHc\_1-C+1) \\\] 合計で 150 個のテストケースがあり、各テストケースの得点の合計が提出の得点となる。 一つ以上のテストケースで不正な出力や制限時間超過をした場合、提出全体の判定が WA や TLE となり、提出の得点は 0 点となる。 コンテスト時間中に得た最高得点で最終順位が決定され、コンテスト終了後のシステムテストは行われない。 同じ得点を複数の参加者が得た場合、提出時刻に関わらず同じ順位となる。 ### 入力生成方法 $ \mathrm{rand}(L,R) $ を、 $ L $ 以上 $ R $ 以下の整数から一様ランダムに値を生成する関数とする。 まず、 $ c_1=5 $ とし、 $ \ell=3,5,7,9 $ の順に $ c_\ell=\mathrm{rand}(2\ell-1,2\ell+4) $ を生成する。 次に、穴の位置を以下の手順で生成する。 穴の個数が $ K $ 個になるまで、 $ a=\mathrm{rand}(0,W-1) $ 、 $ b=\mathrm{rand}(0,H-1) $ の順に値を生成する。 マス $ (a,b) $ にまだ穴があいていなければ穴をあけ、すでに穴があいていればその組を捨てて再び $ a,b $ を生成する。 ### ツール(入力ジェネレータ・ビジュアライザ) - [Web版](https://img.atcoder.jp/ahc071/Wfu7FwbO.html?lang=ja): ローカル版より高性能でアニメーション表示が可能です。 - [ローカル版](https://img.atcoder.jp/ahc071/Wfu7FwbO.zip): 使用するには[Rust言語](https://www.rust-lang.org/ja)のコンパイル環境をご用意下さい。 コンパイルが通らない場合は `rustup update` をお試し下さい。 - [Windows用のコンパイル済みバイナリ](https://img.atcoder.jp/ahc071/Wfu7FwbO_windows.zip): Rust言語の環境構築が面倒な方は代わりにこちらをご利用下さい。 コンテスト期間中に、ビジュアライズ結果の共有や、解法・考察に関する言及は禁止されています。 ご注意下さい。 本コンテストでは、生成AIの利用は一部の例外を除き禁止されています。 詳細は[こちらの記事](https://atcoder.jp/posts/short-ahc-llm-rules-ja)をご確認ください。