はじめに
おはようございます(3か月ぶりの起床)。
同期や後輩たちに「代表ならコンテストに出ろよ。処しますよ(大意訳)。」と言われたので、25k円目当てで出ました。
結果として、1ペナでA〜Eの5完。大勝ちできてよかったです。

前回は、Unratedのつもりで参加したのにRatedになっていたという大規模人災で、レートが爆下げでした。今回は、まぁ、おおかた戻せたかなと。本当に気を付けないといけませんよ。
「自分はそんなことしないよw。」って方。
します。
体感では、難易度は
A < C << D < B <<< E… という感じでした。
明らかに今回はA〜Dまでが簡単セットだったので、ちゃんと解き切れてよかったです。偏角ソートや、なぜか整備していた幾何ライブラリも活かせました。
結果サマリ
- ABC481
- WCPC参加人数: 6人
- 各問題の最速解答者(実AC時刻)
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 0:23 | Java24 (OpenJDK 24.0.2) |
| B | ShoboiNamae | 3:47 | C++23 (GCC 15.2.0) |
| C | ShoboiNamae | 6:17 | C++23 (GCC 15.2.0) |
| D | Caffeineholic | 17:22 | Python (PyPy 3.11-v7.3.20) |
| E | Twil3 | 94:46 | Rust (rustc 1.89.0) |
| F | - | - | - |
| G | - | - | - |
今週の出題
ABC481-A
問題文を表示
問題文
以上 以下の整数 が与えられます。
の値の桁数を求めてください。
制約
- は 以上 以下の整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
さて、簡単枠です。天下のPython様なら、
len(str(a+b))
で答えが出ます。Rust君でも文字列に変換して長さを求められます。整数のまま計算するなら、
(a+b).ilog10() + 1
が手っ取り早いと思います。いつも +1 が必要なのか悩みます。普通に考えたら、いるんですけどね。
ABC481-B
問題文を表示
問題文
平面上に の番号が付けられた 個の点があり、点 の座標は です。
について点 と点 を線分で結び、1本の折れ線を作ります。
この折れ線上(端点も含む)にある点のうち、 座標が であるものの個数を求めてください。
ただし、制約より条件を満たす点の個数は有限であることが保証されます。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
折れ線上にある点のうち、 座標が であるものの個数を出力せよ。
嫌いです。
ここでは配列を0始まりとします。各線分の内部で高さ をまたぐ点と、高さがちょうど の頂点を分けて数えます。
配列 の末尾に と同じ値を番兵として追加し、 について、
のいずれかの条件を満たした回数が答えとなります。番兵を追加すると、最後の頂点も同じループで数えられます。番兵との間では高さ をまたがないので、余計な交点は数えません。
ABC481-C
問題文を表示
問題文
コワスギ銀行の裏庭では、幽霊がカボチャを育てています。あなたはカボチャたちに銀行口座を開設してあげることにしました。
カボチャ用銀行口座には、開設時に名前と ID を 1個ずつ割り当てます。ID の値を選ぶときは、まだ ID として使われていない正の整数のうち最小のものを採用します。
はじめ、カボチャ用銀行口座はひとつも開設されていません。以下の出来事が 回起きるので、順に処理してください。
-
カボチャがやってきて、名前 を名乗る。
- 名前 が割り当てられた口座が存在する場合、その ID を出力する。
- 名前 が割り当てられた口座が存在しない場合、名前 の口座を新規に 1個開設し、その ID を出力する。
制約
- は 以上 以下の整数
- 各出来事において、 は英小文字からなる長さ 以上 以下の文字列
入力
入力は以下の形式で標準入力から与えられる。
は 回目の出来事を表し、以下の形式で与えられる。
出力
行出力せよ。 行目には、 回目の出来事で出力するべき値を出力せよ。
HashMap(Pythonでは dict)を使えばいいです。
ABC481-D
問題文を表示
問題文
個の惑星と 本の航路があります。惑星には から までの、航路には から までの番号が付けられています。
航路 は惑星 から惑星 へと結ばれています。各航路は一方通行です。
この空間において、宇宙船は以下の 種類の操作を行うことができます。
- 今いる惑星から航路が直接結ばれた惑星のうち、番号が最小の惑星に、燃料を消費せずに移動する。
- 今いる惑星から航路が直接結ばれた惑星を好きに選び、燃料を 消費して選んだ惑星に移動する。
宇宙船が惑星 から出発して惑星 に到着するまでに消費する燃料の量の最小値を求めてください。到達が不可能な場合は代わりに を出力してください。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
各頂点について、航路で直接移動できる惑星のうち、番号が最小の惑星を記録しておきます。その惑星への航路のコストを 、それ以外を として、ダイクストラ法で最短距離を求めれば万事解決です。
ABC481-E
問題文を表示
問題文
平面上に 個の星があります。 個目の星は、座標が である点として表されます。
原点を通りどの星も通らない直線を 1本引き、その直線によって分けられる二つの領域のうちどちらか一方の領域を選びます。
選んだ領域に含まれる星の個数としてありうる最大値を求めてください。
個のテストケースが与えられるので、それぞれについて答えを求めてください。
制約
- 全てのテストケースにおける の総和は 以下
- どの相異なる 2個の星についても、それらと原点が一直線上に並ぶことはない
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
各テストケースは以下の形式で与えられる。
出力
行出力せよ。 行目には、 番目のテストケースに対する答えを出力せよ。
さて、ここからがマグマです。
どの2点も原点と一直線上に並ばない、という制約がとても大事です。ある点を始点として、そこから反時計回りに偏角の差が180°未満となる点を、始点も含めて数えます。その最大値が答えです。原点と始点を通る直線を始点の直前まで少し回せば、数えた点をすべて同じ領域に含められます。
つまり、偏角ソートを行い、各点を始点として180°未満に収まる範囲の終わりを二分探索します。判定には、なぜかライブラリにあった ccw を使えます。
ccwは、3点の向きを外積で調べる関数です。原点を 、始点を 、調べる点を とすると、今回のライブラリでは次の値を返します。
正なら は有向直線 の左側、負なら右側、 なら直線上です。戻り値は外積そのもので、 の3値ではないので、符号を見ます。
今回は異なる2点が原点と一直線上に並ばないため、始点以外で になることはありません。ccw(O, P_i, P_j) > 0 なら、 から へ反時計回りに測った角度は0°より大きく180°未満です。角度を小数で計算せず、整数の掛け算と引き算だけで判定できます。
末尾から先頭へ回り込む範囲も扱うには、偏角順の配列を2周分並べます。各始点の次から残り 個を調べると、ccw > 0 を満たす点が先に続き、その後は満たさなくなります。この境界を二分探索し、条件を満たす点の個数に始点の1個を足せばよいです。調べる範囲を 個に限るので、同じ点を二度数えることもありません。
ABC481-F, G
なにもわかりませんでした!!!
最後に
いつも自信がないままRatedで参加して、レートがめっちゃ盛れてしまっているのが本当に嫌です。
周りは実力があると言ってくれますが、本当にないと思います。まじでないと思ってます。でも、勝ててしまってるので嫌だなぁと。
それでは、また。