はじめに
こんにちは。少し疲れ顔のCaffeineholicがお送りするABC463振り返り記事です。
タスクが溜まっていても、言語の実行速度で足蹴にされても、靴の中底に点字ブロックを敷いたままでは渡れる道路も渡れませんよね。足踏みせずに今週もrated参加し、ABCEの4完でした。E問題に蹴り込むことができましたが、やはり5完への道のりの長さを実感しています。
結果サマリ
- コンテスト: ABC463
- WCPC参加人数: 6人
各問題の最速解答者 (ペナルティ無し)
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 0:28 | Java |
| B | kotomiko | 2:05 | C++ |
| C | nsubaru | 8:34 | Java |
| D | ShoboiNamae | 50:52 | C++ |
| E | Caffeineholic | 71:10 | Python |
| F | - | - | - |
| G | - | - | - |
今週の出題
A問題
問題文を表示
問題文 横 ピクセル、縦 ピクセルの画像があります。
横の長さと縦の長さの比が 対 であるか、すなわち であるかを判定してください。
制約 -
- 入力はすべて整数
入力 入力は以下の形式で標準入力から与えられる。
出力 横の長さと縦の長さの比が 対 ならば Yes を、そうでないならば No を出力せよ。
A問題はいつも通りの難易度でした。計算誤差を過剰に怖がるなら、割り算するより 9 * X == 16 * Y かどうかを判定するのが良さそうですね。
B問題
問題文を表示
問題文 高橋君は列車の座席を予約しようとしています。
高橋君が予約する候補としている列車は 本あり、列車 と番号が付けられています。いずれの列車も座席は 列からなり、それぞれ A 列、B 列、C 列、D 列、E 列と呼ばれています。
各列車の現在の空席情報が文字列 として与えられます。ここで はすべて長さ で、列車 の A 列から E 列までがそれぞれ の 文字目から 文字目と対応しており、その文字が o ならば対応する列に空席があることを、x ならば対応する列に空席がないことを意味します。
高橋君は 列の席を予約したいです。ここで は A、B、C、D、E のいずれかです。 本以上の列車において 列に空席があるか判定してください。
制約 - は 以上 以下の整数
- は A、B、C、D、E のいずれか
- は
o、xからなる長さ の文字列
入力 入力は以下の形式で標準入力から与えられる。
出力 本以上の列車において 列に空席があるならば Yes を、そうでないならば No を出力せよ。
B問題は最初からグリッドとして見て半ば機械的に解いてしまいました。Pythonの str 型の index() 関数に近いものを使えば実装が楽にはなりますが、そこまで複雑ではないので特に苦戦は強いられないと思われます。
C問題
問題文を表示
問題文 現在、会議室に 人の高橋くんがいます。 番目 の高橋くんの身長は であり、今から 分後に会議室を去ります。 一度会議室を去った高橋くんはそれ以降会議室に戻ることはありません。
個のクエリが与えられるので、順に答えてください。
番目 のクエリでは整数 が与えられるので、今から $T_i
- 0.5T_i + 0.51$ 人以上の高橋くんがいることが保証されます。
制約 -
- 入力はすべて整数
入力 入力は以下の形式で標準入力から与えられる。
出力 行にわたって出力せよ。 行目 には、 番目のクエリに対する答えを出力せよ。
一見少し複雑に見えたC問題です。L の値が昇順で与えられる一方、クエリの T の値がばらばらなので、これを昇順にソートして尺取り法のように同時に進めるのが直観的でした。無理に典型と結びつけるならクエリ先読みにあたるでしょうか。
heap queue 解法を思いつきましたが、最大値でない高橋くんをどうやって退出させるかがネックです。DPも難しいし、それなら思いついているもので解こう、ととりあえず手を動かしました。
D問題
問題文を表示
問題文 数直線上に 枚の布があります。 枚目 の布は数直線上の区間 を覆っています。 数直線上の点は 枚以上の布で覆われていることも、どの布にも覆われていないこともあります。
枚の布が重なっているとは、数直線上のある点がその 枚の布どちらにも覆われていることをいいます。
重なっていない 枚の布について、それらの距離を以下のように定めます。
一方の布に覆われている点 ともう一方の布に覆われている点 に対する の最小値
どの 枚も重なっていない 枚の布に対して、そのスコアを布どうしの距離の最小値と定めます。 枚の布からどの 枚も重なっていないように 枚を選ぶときのスコアの最大値を求めてください。
ただし、そのように 枚の布を選ぶことができない場合、-1 を出力してください。
制約 -
- 入力はすべて整数
入力 入力は以下の形式で標準入力から与えられる。
出力 答えを出力せよ。
入力例 1 6 3
1 12
2 7
5 9
9 13
10 18
15 20
出力例 1 2
枚目、 枚目、 枚目の布を選ぶと、これらはどの 枚も重なっていません。 枚目の布と 枚目の布の距離は 、 枚目の布と 枚目の布の距離は 、 枚目の布と 枚目の布の距離は なので、この選び方のスコアは です。
スコアが 以上になるように 枚の布を選ぶことはできないため、 を出力してください。
D問題は、誤読により本番中に解けませんでした。サークル内では一人だけ、ShoboiNamae君が本番ACしてましたね。すごすぎる。
問題文中の「スコア」の総和を最大化する問題だと思っていたら、どうやら「スコア」の最小値の最大化だったようで…。これなら隣り合う布同士の最低限の「距離」を固定すれば でそれが適切か否かを判定でき、結果が単調になるのでいわゆる 「答えで二分探索」 を書けますね。この誤読がなければ時間内にEが解けたか分からなかったので結果オーライと言えばそうですが、あわよくば5完したかったです。
E問題
問題文を表示
問題文 AtCoder 国には 個の都市と 本の道路があります。 本目の道路 は都市 と都市 を双方向に繋いでおり、一方からもう一方へ 分かけて移動することができます。
また、それぞれの都市にはワープゲートが設置されており、都市 から都市 へワープゲートを使って 分かけて移動することができます。
これ以外の方法で AtCoder 国の都市の間を移動することはできません。
について、次の問題を解いてください。
都市 から都市 へ移動するのにかかる時間の最小値を求めよ。
ただし、道路やワープゲートから同じ都市の別の道路やワープゲートへ移動するのにかかる時間は無視できるものとします。
制約 -
-
-
-
-
-
-
入力はすべて整数 入力 入力は以下の形式で標準入力から与えられる。
出力 に対する問題の答えを、この順に空白を区切りとして出力せよ。
E問題は愚直に解くと スケールで辺を追加しなければならずTLEしますが、ある地点を経由するような動きをさせることで辺の数を にまで落とせます。同じような問題をどこかで見ましたが、 「超頂点」 と呼ばれる典型だそうです。
追加しなければならない辺を図に描いていると、無駄に同じ重みの辺をたくさん追加しているなと気づけるかもしれません。辺の数は の2倍しか増えないので、あとは重みつきグラフで最小コスト経路を求めるときに使う、あのアルゴリズムで解けますね。
最後に
D問題ではDP解法も浮かんでいましたが、DPにいまだ苦手意識があり「どうせ実装できないだろう」と二の足を踏んでいました。最初に思いついたアルゴリズムで無理やり実装しきって進むためにも、E問題を踏み越えるためにも、そろそろ克服したいところです。
Caffeineholicでした。