A - 団子とうさぎ

Time Limit: 2 sec / Memory Limit: 64 MB

 古来より,月にはうさぎが住んでおり,餅をついていると言われている.我々が月を見上げるとき,うさぎ達もまた地球を見ているのである.

問題

 今,うさぎたちの目の前には N 段に積まれた団子がある.今回の積み方では,上から x 段目には,x^2 個の団子がある.これらの団子を M 匹のうさぎたちで平等に分けることを考えよう.あなたの仕事は,団子を平等に分けた時,いくつ団子が余るかを求めるプログラムを書くことである.

入力

入力は以下の形式で標準入力から与えられる.
N M
  • 団子の段数を表す整数 N(1 ≦ N ≦ 100) とうさぎの数 M(1 ≦ M ≦ 100)が半角スペース区切りで与えられる.

出力

団子を平等に分けた時,余る団子の数を標準出力に 1 行で出力せよ.
なお、最後には改行を出力せよ.

入力例 1

3 4

出力例 1

2
  • 団子の総数は 1^2 + 2^2 + 3^2 = 14 であり,これをうさぎの数 4 で割った余りは 2 である.

入力例 2

5 5

出力例 2

0
  • 団子の総数は 55 であり,これをうさぎの数 5 で割った余りは 0 である.
B - 雨上がり

Time Limit: 2 sec / Memory Limit: 64 MB

 雨が上がった.そろそろ大学に行こう.

問題

 僕の家から大学までは一本道の道路で結ばれている.道路は区間に分けることができ,ここでは,道路を一行の文字列で表すことにする.各文字が1つの区間に相当し,1文字目が家の前の区間,最後の文字が大学の前の区間を表している.

 ここで,各文字の意味は次のとおりである.
 . : 普通の区間
 X : 水たまりのある区間
 僕は家の前の区間からスタートし大学へ向かう.僕は現在位置から1つ,2つ,もしくは3つ先の区間(大学のある方向)へ進むことができる.もし,移動した先の区間に水たまりがある場合,僕は水たまりを踏むはめになる.買ったばかりの靴を汚したくないので,なるだけ水たまりを避けたい.また,大学の前の道路を超えて移動するようなことはできない.

 家の前の道路から大学の前の道路まで適切な進み方で向かうとき,最低限踏まなければならない水たまりの数を求めてほしい.

入力

入力は以下の形式で標準入力から与えられる.
N
S
  • 1 行目に区間の数を表す N(3 ≦ N ≦ 100) が与えられる.
  • 2 行目には,N 文字の文字列 S が与えられる.これらは道路の区間のデータである.
  • S に出現する文字は '.', 'X' のいずれかであり,意味は上に記した通りである.
  • S の最初と最後の文字は必ず '.' である.

出力

最低限踏まなければならない水たまりの数を標準出力に 1 行で出力せよ.
なお、最後には改行を出力せよ.

入力例 1

5
.XXX.

出力例 1

1

入力例 2

10
.X.XXXXXX.

出力例 2

2

入力例 3

7
.......

出力例 3

0
C - 至高のケーキ

Time Limit: 2 sec / Memory Limit: 64 MB

 今日もまた,きっと誰かの誕生日だ.ここでは,とあるイチゴが苦手な人の誕生日ケーキにまつわる次の問題に答えて欲しい.

問題

 ある人の誕生日ケーキを考える.誕生日ケーキは NM 列から成り,N×M個の正方形に切り分けることができる.各正方形には「効用」が設定されており,ある人がその部分のケーキを食べた時どれだけ満足度を得られるか,が決まっている.彼が最終的に得られる満足度は,切り分けた正方形の効用の合計である.また,ケーキの一部はイチゴを含むことがある.

 ここでは,誕生日ケーキを文字列で表すことにする.ケーキの各部分は文字で表す.ここで,各文字の意味は次のとおりである.
 0, 1, 2, ..., 9 : 書かれた数値の効用が得られる部分
 X : イチゴを含む部分
 ここで,ある人に誕生日ケーキを切り分けることを考える.その人は階段上の形が好きなので,図 1 に示すような階段上の形のケーキを 1 つだけ切り分け,彼に与える.正方形 1 つの形も階段状であるとみなす.ただし,彼はいちごがとても苦手なので,いちごを含む部分は切り分けないようにしたい.例えば,図 2 のようにいちごを含むような切り分け方はできない.

 ケーキの効用といちごの場所が与えられるので,彼が得られる満足度の最大値を求めよ.  
図1: ケーキの切り分け方

図2: 無効な切り分けの例

     

入力

入力は以下の形式で標準入力から与えられる.
N M
c_{1,1}c_{1,2} ... c_{1,M}
c_{2,1}c_{2,2} ... c_{2,M}
...
c_{N,1}c_{N,2} ... c_{N,M}
  • 1 行目にケーキの大きさを表す N(1 ≦ N ≦ 30) と M(1 ≦ M ≦ 30) が半角スペース区切りで与えられる.
  • 2 行目から N+1 行目には,M 文字の文字列が与えられる.これらケーキの効用値,あるいはいちごを表すデータである.
  • 文字列中に出現する文字列は '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X' のいずれかであり,意味は上に記した通りである.
  • ケーキの文字列の中に出現する 'X' の数は N × M より少ないことを仮定してよい.

出力

彼が得られる満足度の最大値を1行に出力せよ.
なお、最後には改行を出力せよ.

入力例 1

3 3
433
333
333

出力例 1

19
例えば,
433
33
3
という部分を切り分けることにより,効用 19 が得られる.

入力例 2

3 5
11111
1X1X1
11111

出力例 2

3
このケースの場合,いちごがあるため,大きさ 3 以上のケーキは切り分けられない.よって,例えば
 1
11
という部分を切り分けることにより,効用 3 が得られる.
D - 5キューブ

Time Limit: 2 sec / Memory Limit: 64 MB

 5キューブは立方体を使ったパズルである.今回はこれをコンピュータを用いて自動で解くことを考えよう.

問題

 一辺の長さが 5 である立方体状のコンテナがある.また,それ以下の整数の大きさを持つ立方体のオブジェがたくさんある.パズルのゴールは,これらのオブジェをコンテナからはみ出さないように敷き詰めることである.オブジェはたくさんあるので,コンテナの数は 1 つでは足りないかもしれないが,使うコンテナの数が少なければ少ないほど高得点が得られる.

 それぞれの大きさのオブジェの数が与えられるので,使うべきコンテナの数の最小値を答えよ.

入力

入力は以下の形式で標準入力から与えられる.
N_{1} N_{2} N_{3} N_{4} N_{5}
  • 1 行目には,一辺の長さが x であるオブジェの数 N_{x}(1 ≦ x ≦ 5, 0 ≦ N_{x} ≦ 1,000,000,000) が半角スペース区切りで与えられる.
  • ∃x :: N_{x} ≧ 1 を仮定してよい.すなわち,オブジェは必ず 1 つ以上与えられる.

出力

必要なコンテナの数を 1 行に出力せよ.
なお、最後には改行を出力せよ.

入力例 1

109 2 0 0 1

出力例 1

2
コンテナがちょうど 2 つ必要になる.
1 つめのコンテナには,大きさ 1 のオブジェと大きさ 2 のオブジェを全て詰めることができる.
2 つめのコンテナには,大きさ 5 のオブジェを詰めることができる.

入力例 2

0 0 0 5 0

出力例 2

5
コンテナ 1 つにつき,大きさ 4 のオブジェは 1 つしか入れられない.よって,大きさ 4 のオブジェの数に等しいコンテナが必要になる.

入力例 3

1000000000 1000000000 1000000000 1000000000 1000000000

出力例 3

3000000000
E - 独立記念日

Time Limit: 2 sec / Memory Limit: 64 MB

 長らく続いたW帝国がその歴史に終止符を打とうとしていた.多くの少数部族の反乱により,複数の独立国家に分かれることになったのだ.そこで,帝国のとある領主は次のやっかいな問題に直面している.彼の最後の仕事を手伝ってあげよう.

問題

 N 個の都市を繋ぐ M 個の道路の情報が与えられる.各道路は異なる 2 つの都市を繋いでおり,双方向に移動することができる.道路の情報は2つの異なる都市の番号(1N)と分断コストで与えられる.なお,2 つの都市を結ぶ道路の数は高々 1 つであり,閉路の数も高々 1 つである.

 N 個の都市を K 個以上の独立したグループに分解するとき,分解に必要なコストの最小値を求めよ.ここで,ある 2 つのグループが独立であるとは,お互いのグループに含まれる都市の間に道がないことである.

入力

入力は以下の形式で標準入力から与えられる.
N M K
f_{1} t_{1} c_{1}
f_{2} t_{2} c_{2}
...
f_{M} t_{M} c_{M}
  • 1 行目に都市の数を表す N(1 ≦ N ≦ 100) と道路の数 M(0 ≦ M ≦ N*(N-1)/2)),および目標のグループ数 K(1 ≦ K ≦ N) が半角スペース区切りで与えられる.
  • 2 行目~ M+1 行目にはそれぞれ道路の情報,つまり,道路が結ぶ二つの街の番号 f_{i}t_{i},および分断コスト c_{i} が半角スペース区切りで与えられる.
  • i について 1 ≦ f_{i} ≦ N かつ 1 ≦ t_{i} ≦ Nf_{i} ≠ t_{i}1 ≦ c_{i} ≦ 1,000,000 を満たす.
  • 2 つの都市を結ぶ道路の数は高々 1 つである.都市から 1 本も道路が出ていないこともある.
  • 与えられるグラフに含まれる閉路の数は高々 1 つである.

出力

分断に必要な最小コストを 1 行に出力せよ.
なお、最後には改行を出力せよ.

部分点

30 点分については,グラフに閉路を含まないことが保証される.

入力例 1

2 1 2
1 2 5

出力例 1

5

入力例 2

3 3 3
1 2 5
2 3 5
3 1 5

出力例 2

15
3 つのグループに分けるためには,すべての道路を切断する必要があり,それには 5 + 5 + 5 = 15 のコストがかかる.

入力例 3

3 1 2
1 2 5

出力例 3

0
既に 2 つのグループ(\{1,2\}\{3\})に分かれているため,これ以上道路を切断する必要はない.よって,0 を出力する.
F - 僕は宇宙人

Time Limit: 3 sec / Memory Limit: 256 MB

 僕は宇宙人.長い旅路の末,遥か彼方からここへやってきたのです.地球はよいところですね.

問題

 宇宙人が使うコミュニケーションボードは,NM 列のマスから成るボードである.それぞれのマスにはアルファベットが 1 文字だけ書かれている.宇宙人は,このボードを次のような決まりで移動することでメッセージの伝達を行う.  
     
  1. ボードの任意のマス目の上に乗る.
  2.  
  3. 現在地から,進む方向(左,右,上,下)を1つ決める.初回をのぞき,このときの方向は,直前に進んだ方向とは違うものでなければならない.
  4.  
  5. 決めた方向に,次の伝えたい文字が見つかるまで進む.
    •    
    • このとき,もしもボードの外に出てしまったら,伝達失敗となる.
    •    
    • 移動のとき,進んだマス目に応じたコストがかかる.x マス進んだときのコストは x である.   
      
  6. 進行中に伝えたい文字が見つかったら,直ちに止まる.
  7.   
  8. 伝えたい文字が残っていない場合は,伝達終了となる.まだ文字が残っている場合は,2. に戻る.
  9.  
  このメッセージ伝達手法は,方向の選び方によって伝達に失敗したり,あるいは移動コストがかかりすぎることが問題である.
そこで,あなたの仕事はボードの文字と伝えたい文字列が与えられたとき,伝達不可能であるかを判定することと,伝達可能である場合,その最小コストを求めることである.

入力

入力は以下の形式で標準入力から与えられる.
N M L
S
c_{1,1}c_{1,2} ... c_{1,M}
c_{2,1}c_{2,2} ... c_{2,M}
...
c_{N,1}c_{N,2} ... c_{N,M}
  • 1 行目にボードの大きさを表す N(1 ≦ N ≦ 100) と M(1 ≦ M ≦ 100),および伝えたい文字列の文字数 L(1 ≦ L ≦ 100) が半角スペース区切りで与えられる.
  • 2 行目にはアルファベットの小文字のみを含む長さ L の文字列 S が与えられる.これは宇宙人が伝えたい文字列を表している.
  • 3 行目~ N+2 行目には,M 文字のアルファベットの小文字のみを含む文字列が与えられる.これらはボードに書かれている文字を表すデータである.

出力

メッセージの伝達に必要な最小コストを 1 行に出力せよ.もし伝達が不可能である場合は,"-1" と出力せよ.
なお、最後には改行を出力せよ.

入力例 1

3 3 2
ab
xzz
azb
zzz

出力例 1

3
最初に 'x' の位置に乗り,'a' まで移動し止まる.その次に右に進み,'b' まで移動し止まる.これにより,最小コスト 3 が達成できる.

入力例 2

3 4 2
ab
xzza
azzz
zzbz

出力例 2

-1
どの場所の 'a' から上下左右の方向に進んでも 'b' には到達できないため,メッセージの伝達は不可能である.
G - だるま落とし

Time Limit: 2 sec / Memory Limit: 256 MB

 だるま落としロボットは自動でだるま落としをするロボットである.ロボットにはハンマーがついており,指定された高さで正確にブロックを叩くことができる.ロボットの開発が佳境に入り,いよいよ実践テストを行うことになった.テストをスムーズに進めるため,次のようなプログラムを書いて欲しい.

問題

 初期状態で N 個のブロックが積み上がっただるま落としを考える.それぞれのブロックの高さは下から数えて,a_{1} a_{2} ... a_{N} である.また,ロボットのハンマーの幅の半径を H とする.次のようなクエリが M 個与えられるので,順番に処理せよ.

 「ブロック追加(add)」クエリ : 現在のだるまの一番上に,新たに高さ arg_{i} のブロックを追加する.このクエリに対して出力を行う必要はない.

 「チャレンジ(challenge)」クエリ : ハンマーの中心が高さ arg_{i} である状態でだるまを落とそうとする.この動作に対するロボットへの指示を出力せよ.
 
 ここで,ハンマーが 2 つ以上のブロックにまたがってしまう場合は,だるまが崩れてしまうため,ロボットの動作を止める必要がある.そのような場合は,"stop" と出力せよ.指定された位置が高すぎてハンマーがブロックに当たらない場合は,"miss" と出力せよ.これらの場合は,ブロックに影響はない.
 
 それ以外の場合,(ハンマーの位置が正しい場合),"go" と出力せよ.その場合,ロボットは指定された位置でハンマーを回転させ,ブロックを1つだるまから外す.そのブロックの上に積み上がっているブロックたちは,そのまま下に落下し,ブロックの数が 1 つ減っただるまができる.なお,ハンマーかただ1つのブロックにまたがる場合で,上面や下面がちょうどブロックの境目に接している場合でも,ロボットへは "go" と指示せよ.
 
図1. 初期配置

図2. addクエリ: 高さ arg_{i} のブロックを上に追加

図3. challengeクエリ: 高さ arg_{i} で叩く

入力

入力は以下の形式で標準入力から与えられる.
N M H
a_{1} a_{2} ... a_{N}
operation_{1} arg_{1}
operation_{2} arg_{2}
...
operation_{M} arg_{M}
  • 1 行目に初期状態のブロックの数 N(1 ≦ N ≦ 100,000) とクエリの数 M(1 ≦ M ≦ 100,000),およびハンマーの半径 H(1 ≦ H ≦ 100,000) が半角スペース区切りで与えられる.
  • 2 行目には初期状態で積まれているブロックの高さ a_{i}(1 ≦ a_{i} ≦ 100,000) が半角スペース区切りで与えられる.
  • 3 行目~ M+2 行目にはクエリの情報が与えられる.
  • 各クエリは操作名( operation_{i} )と引数( arg_{i} )から成り,それぞれ半角スペース区切りで与えられる.各クエリは以下の条件を満たす.
    • operation_{i} = \{add, challenge\}
    • operation_{i} = addのとき,1 ≦ arg_{i} ≦ 100,000 を満たす.
    • operation_{i} = challengeのとき,H ≦ arg_{i} ≦ 1,000,000,000,000 を満たす.

出力

operation_{i} = challengeであるクエリに対する答えを与えられた順番に1 行ずつ出力せよ.
なお、最後には改行を出力せよ.

部分点

20 点分については,上記条件に加え,以下の条件を全て満たす.
  • 1 ≦ N ≦ 1,000
  • 1 ≦ M ≦ 1,000

入力例 1

3 10 3
10 10 10
challenge 5
add 20
challenge 10
challenge 15
add 1
add 9
challenge 31
challenge 38
challenge 50
challenge 40

出力例 1

go
stop
go
stop
go
miss
miss
H - ダイヤグラム

Time Limit: 2 sec / Memory Limit: 256 MB

 あなたはとある鉄道会社で,とある地区の発展を任された敏腕マネージャである.最近,地区の人口が増えてきたため,近くの路線の列車の運行本数を増やすことにした.

問題

 東西にレールが引かれたとある路線には N つの駅があり,枝分かれせずに 1 本に繋がっている.各駅には西から東に向かって順番に 駅1,駅2,... 駅Nという番号がついている.
 ここで,この路線に新たに M 本の列車を導入できることになった.各列車は始発駅と終着駅が決まっており,その間を各駅停車で運行する.あなたの仕事は,駅 1 から駅 N までの各駅に,少なくとも 2 つ以上の列車が止まるように運行する列車を選ぶとき,その選び方の場合の数を答えることである.答えはとても大きくなるかもしれないので,1,000,000,007 で割った余りを答えよ.

入力

入力は以下の形式で標準入力から与えられる.
N M
start_{1} end_{1}
start_{2} end_{2}
...
start_{M} end_{M}
  • 1 行目には駅の数 N(2 ≦ N ≦ 100,000) と列車の数 M(1 ≦ M ≦ 200)が半角スペース区切りで与えられる.
  • 2 行目~ M+1 行目には各列車の情報,つまり始発駅 start_{i}と終着駅 end_{i} が半角スペース区切りで与えられる.
  • i について 1 ≦ start_{i} < end_{i} ≦ Nを満たす.

出力

場合の数を 1,000,000,007 で割った余りを 1 行に出力せよ.
なお、最後には改行を出力せよ.

部分点

10 点分については,入力の条件に加え,以下の条件を全て満たす.
  • 2 ≦ N ≦ 8
  • 1 ≦ M ≦ 8

50 点分については,入力の条件に加え,以下の条件を全て満たす.
  • 2 ≦ N ≦ 40
  • 1 ≦ M ≦ 40

入力例 1

3 3
1 3
1 3
1 3

出力例 1

4
3 つの列車のうち,2 つ以上使うことで,条件が達成できる.

入力例 2

5 4
1 2
2 3
3 4
4 5

出力例 2

0
与えられた列車だけでは条件を達成できない(駅 1,駅 5 に停まる列車が 1 つしかない)ため,答えは 0 通りである.

入力例 3

8 4
1 4
1 4
5 8
5 8

出力例 3

1
全ての列車を使うとき,以下の図のように全ての駅に列車が 2 つ以上停まるので条件を満たす.この場合,駅 4 と駅 5 の間には列車が運行しないが,気にしてはいけない.
図1:入力例3の駅と列車の様子
I - その味は甘くて

Time Limit: 5 sec / Memory Limit: 512 MB

 突然だが,あなたはとある養蜂家専属のプログラマである.ある日,巣で生成されるハチミツの糖度を管理するために,次のようなプログラムを作成するよう求められた.

問題

 下図のような正六角形が敷き詰められた座標系を考える.
図1:正六角形が敷き詰められた座標系

 指定された座標系の上に,蜂の巣の情報が与えられる.蜂の巣は,巣のタイプと中心部の座標,および大きさから成る.巣のタイプによって,巣に含まれる六角形がどのような糖度を持つかが異なる.
     
  • タイプ1 : 巣に含まれる全ての六角形に一様に糖度 1 が加算される.
  •  
  • タイプ2 : 大きさを n,中心からの距離を d とすると,糖度 n-d が加算される.
  •  
  • タイプ3 : 大きさを n,中心からの距離を d とすると,糖度 (n-d)^2 が加算される.
 
 例えば,大きさが 3 である各タイプの巣に含まれる六角形の糖度は,以下の図のように加算される.

図2:大きさ 3 の各タイプの巣

 また,六角形が複数の巣に含まれる場合は,その部分の糖度は各巣についての糖度の和になる.最大の糖度を持つ部分の糖度を出力せよ.

入力

入力は以下の形式で標準入力から与えられる.
N
type_{1} x_{1} y_{1} size_{1}
type_{2} x_{2} y_{2} size_{2}
...
type_{N} x_{N} y_{N} size_{N}
  • 1 行目には蜂の巣の数 N(1 ≦ N ≦ 10,000) が与えられる.
  • 2 行目~ N+1 行目には各巣の情報が 1 行ずつ与えられる.
  • 各巣の情報はタイプ( type_{i} ),中心座標( x_{i}y_{i} ),および大きさ( size_{i} )から成り,それぞれ半角スペース区切りで与えられる.また,それぞれ以下の条件を満たす.
    • 1 ≦ type_{i} ≦ 3
    • |x_{i}| ≦ 500
    • |y_{i}| ≦ 500
    • 1 ≦ size_{i} ≦ 500

出力

最も糖度の高い六角形の糖度を1 行に出力せよ.
なお、最後には改行を出力せよ.

部分点

10 点分については,入力の条件に加え,以下の条件を全て満たす.
  • 1 ≦ N ≦ 100
  • type_{i} = 1
  • |x_{i}| ≦ 100
  • |y_{i}| ≦ 100
  • 1 ≦ size_{i} ≦ 100

50 点分については,入力の条件に加え,以下の条件を全て満たす.
  • type_{i} = 1


入力例 1

1
1 0 0 3

出力例 1

1

入力例 2

1
3 -1 -1 4

出力例 2

16
タイプ3,大きさ4の巣の最大糖度は 16 である.

入力例 3

2
1 0 0 3
3 -1 -1 4

出力例 3

17
複数の巣が重なる場合,その部分の糖度は各巣についての糖度の合計になる.

入力例 4

3
1 0 0 2
1 1 -1 2
1 -1 1 2

出力例 4

3
巣の様子は以下の図のようになる.
図3:入力例4における巣の様子