WCPC
AtCoder

ABC460参加記

2026年5月30日 C Caffeineholic

前回の参加記(ABC459回)

はじめに

こんにちは。Caffeineholicがお送りする、何度目かのAtCoder参加記です。

水色D問題が解けず、3完と私にとっては良くも悪くも実力通りのパフォーマンスができた回でした。サークル内でD問題を解ききった3名には拍手を送りたいです。 しかし辛酸を舐めるだけでは夏の猛暑は凌げません。勝利を重ねて、心もレートも潤わせたいところですね。 また、AHC(AtCoder Heuristic Contest)066が開催されています。近いうちにその結果の記事が上がるかもしれません。 今回は私も参加してみます。どうなるかな…

結果サマリ

問題参加者名タイム言語
ACaffeineholic0:53Python
BShoboiNamae8:07C++
CShoboiNamae17:15C++
DShoboiNamae75:03C++
E---
F---
G---

今週の出題

ABC460-A

問題文を表示

問題文
正整数 N,MN, M が与えられます。
MM の値が 00 でない間以下の操作を繰り返すとき、操作を行う回数を求めてください。

  • NNMM で割った余りを xx とする。
  • MM の値を xx で置き換える。

なお、この操作を有限回行うことにより M=0M=0 になることが証明できます。

制約

  • 1N,M10001 \le N, M \le 1000
  • 入力される値はすべて整数

入力
入力は以下の形式で標準入力から与えられる。
NN
MM

出力
答えを出力せよ。

A問題は、ある程度の頻度で登場する「問題文の操作をいかに素早くコードでそのまま表現できるか」を競う回でした。 言語仕様を理解していれば解けます。時間はあまりかけたくありません。

ABC460-B

問題文を表示

問題文
xyxy 平面上に 2 つの円 C1,C2C_1, C_2 があります。ただし、本問題において円とは円周のことを指します。
C1C_1 は中心の座標が (X1,Y1)(X_1, Y_1) で半径が R1R_1 です。
C2C_2 は中心の座標が (X2,Y2)(X_2, Y_2) で半径が R2R_2 です。
C1C_1 と円 C2C_2 が共有点を持つかどうかを判定してください。言い換えると、点 (X1,Y1)(X_1, Y_1) からの距離が R1R_1 であり、かつ点 (X2,Y2)(X_2, Y_2) からの距離が R2R_2 であるような点が 1 個以上存在するかどうかを判定してください。


TT 個のテストケースが与えられるのでそれぞれについて答えを求めてください。

制約

  • 1T1001 \le T \le 100
  • 0X1,Y1,X2,Y21090 \le X_1, Y_1, X_2, Y_2 \le 10^9
  • 1R1,R21091 \le R_1, R_2 \le 10^9
  • 入力される値は全て整数

入力
入力は以下の形式で標準入力から与えられる。ここで caseicase_iii 番目のテストケースを意味する。
TT
case1case_1
case2case_2
\vdots
caseTcase_T


各テストケースは以下の形式で与えられる。


X1    Y1    R1    X2    Y2    R2X_1 \;\; Y_1 \;\; R_1 \;\; X_2 \;\; Y_2 \;\; R_2

出力
TT 行出力せよ。
ii 行目には ii 番目のテストケースの答えを出力せよ。
各テストケースでは、円 C1C_1 と円 C2C_2 が共有点を持つ場合は Yes を、そうでない場合は No を出力せよ。

高校数学のトラウマを刺激され、時間がかかった方々が多くいたB問題です。
ちゃんと考えられましたか?大小の円を描いて、小さい円が大きい円の中にある状態から少しずつ動かしていって、その時々の条件を書き出して…堅実にできましたか?
そんなことしなくとも検索すれば必要十分条件は出てきますが。

そして引っかかるポイントが数学以外にもう一つ、ユークリッド距離の計算で平方根を求める際の誤差です。今回はどんな言語でも誤差は出ますから、距離を算出する関数と比較の方法にひと工夫。 例えば、

def get_dist(x1, y1, x2, y2):
    return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5

このような一般的なユークリッド距離を求める関数を以下のように変更し、距離を2乗した値のまま比較に利用するという方法が使えます。問題設定と制約の桁数で誤差が出ることは予期できたはずですが悔しいことに一度誤答しました。

def get_dist(x1, y1, x2, y2):
    return (x2 - x1) ** 2 + (y2 - y1) ** 2

ABC460-C

問題文を表示

問題文
寿司の材料として、NN 個のシャリと MM 個のネタがあります。
ii 番目のシャリの重さは AiA_ijj 番目のネタの重さは BjB_j です。
あなたは、シャリとネタを組み合わせることで寿司を作ろうとしています。
寿司を 11 つ作るためには、11 つのシャリと 11 つのネタを組み合わせる必要があります。ただし、ネタの重さはシャリの重さの 22 倍以下でなければなりません。また、11 つのシャリやネタを複数の寿司に使うことはできません。
作ることのできる寿司の個数の最大値を求めてください。

制約

  • 1N,M2×1051 \le N, M \le 2 \times 10^5
  • 1Ai,Bj1091 \le A_i, B_j \le 10^9
  • 入力される値はすべて整数

入力
入力は以下の形式で標準入力から与えられる。
N    MN \;\; M
A1    A2        ANA_1 \;\; A_2 \;\; \dots \;\; A_N
B1    B2        BMB_1 \;\; B_2 \;\; \dots \;\; B_M

出力
答えを出力せよ。

C問題に置かれるには比較的簡単な問題でした。必要な考え方は
シャリ i にネタ j が乗るとき、ネタ j より大きいネタは必ずシャリ i より小さいシャリには乗らないという点に着目することです。
当たり前な事実の再確認に見えますが、シャリ、ネタの大きさを昇順にソートしてから考えると必要な操作が見えてきます。 あるネタ i についてそれが乗ることのできる最小のシャリ j を見つけたら、 i+1 以降のネタについて考えるときは j+1 以降のシャリのみから探せばよいということになります。
ということで、ソートしてから尺取りのような操作で貪欲法が正答でした。

この問題にかけた時間だけでいえばかなり早かったのですが、B問題での誤答が響きパフォーマンスが出ませんでした…

似た問題: ABC388-E


ABC460-D

問題文を表示

問題文
HHWW 列のマス目があります。このマス目の上から ii 行目、左から jj 列目のマスをマス (i,j)(i,j) と呼びます。
すべてのマスは白または黒で塗られています。マス目の情報は HH 個の長さ WW の文字列 S1,S2,,SHS_1, S_2, \dots, S_H によって与えられ、SiS_ijj 文字目が . のときマス (i,j)(i,j) は白で、SiS_ijj 文字目が # のときマス (i,j)(i,j) は黒で塗られています。
あなたは、以下の操作を 1010010^{100} 回行います。

すべてのマスに対して同時に以下の規則で色の塗り替えを行う。

  • 操作前に白く塗られているマスは、そのマスに隣接する黒く塗られているマスが存在するとき、またそのときに限り黒く塗り替える。ただし、マス (x,y)(x,y) とマス (x,y)(x',y') が隣接しているとは、片方のマスがもう片方のマスの 8 近傍にある、すなわち max(xx,yy)=1\max(|x-x'|, |y-y'|)=1 であることを指す。
  • 操作前に黒く塗られているマスは、白く塗り替える。

操作を終えた後に各マスが何色で塗られているか求めてください。

制約

  • 1H×W1061 \le H \times W \le 10^6
  • H,WH, W は正整数
  • SiS_i.# からなる長さ WW の文字列

入力
入力は以下の形式で標準入力から与えられる。
H    WH \;\; W
S1S_1
S2S_2
\vdots
SHS_H

出力
HH 行出力せよ。
各行に .# からなる長さ WW の文字列を 11 つずつ出力せよ。
ii 行目の文字列の jj 文字目は 1010010^{100} 回の操作を行った後にマス (i,j)(i,j) が白で塗られているとき . に、黒で塗られているとき # になるようにせよ。

解けなかったD問題です。白マスが黒に、黒マスが白に反転しますが、白が黒に変わるためには8近傍に一つ以上の黒マスがある必要があります。下に私の思考を書き残しておきます。
一見各黒マスから波及していく変化をすべてシミュレーションしないと正答しようがないように思えますが、最悪の場合H×W×10100H \times W \times 10^{100} の回数処理がかかるため不可能です。

グリッドを眺めていると、黒マスが一つでもあればグリッド全体に反転が波及してゆき、その周期はどれも操作2回ぶんであることには気づけます。 あとはどのマスがどのタイミングで反転を繰り返し始めるかを求めたいです。このタイミングについては、あるマスについて「直近の黒マスからの距離」を求めることでわかります。
黒マスから5マス離れた白マスは5回目の操作で、黒マスから8マス離れた白マスは8回目の操作で初めて必ず黒に反転します。 したがって必要な処理を、 全てのマスについて、黒マスからの距離の最小値を求める に帰着できます。これはBFSを用いれば実現可能ですね。

しかしこれだけではACできません。8近傍を黒に囲まれた黒マスは、処理1回目で白くなりますが処理2回目についても白いままです。この事実を発見できず、時間内に修正できませんでした。 水色になるほどかとは思いましたが、いつかはこれくらいの問題は本番中に解ききりたいものです。あらためてACした3人に拍手。

ABC460-E

問題文を表示

問題文
正整数 a,ba, b に対して、aabb を繋げて書いた時に出来る整数を concat(a,b)\text{concat}(a, b) と呼びます。厳密に述べると、concat(a,b)\text{concat}(a, b) を次のように定義します。

  • a,ba, b を 10 進表記して出来る文字列を A,BA, B とする。
  • A,BA, B をこの順に結合して出来る文字列を CC とする。
  • CC を 10 進表記された整数とみなした時の値を concat(a,b)\text{concat}(a, b) とする。

例えば a=123,b=45a=123, b=45 の時 concat(a,b)=12345\text{concat}(a, b)=12345 です。
正整数 N,MN, M が与えられます。
NN 以下の正整数の組 (x,y)(x, y) であって concat(x,y)x+y(modM)\text{concat}(x, y) \equiv x+y \pmod M であるものの個数を 998244353998244353 で割った余りを求めてください。


TT 個のテストケースが与えられるので、それぞれについて答えを求めてください。

制約

  • 1T1041 \le T \le 10^4
  • 1N10181 \le N \le 10^{18}
  • 2M1092 \le M \le 10^9
  • 入力される値は全て整数

入力
入力は以下の形式で標準入力から与えられる。ここで caseicase_iii 番目のテストケースを意味する。
TT
case1case_1
case2case_2
\vdots
caseTcase_T


各テストケースは以下の形式で与えられる。


N    MN \;\; M

出力
TT 行出力せよ。
ii 行目には ii 番目のテストケースの答えを出力せよ。
各テストケースでは、条件を満たす (x,y)(x, y) の個数を 998244353998244353 で割った余りを出力せよ。

相変わらずE問題は難しいですね。桁ごとに考えるというテクニックは頻出ではあるものの、残り時間少ない中冷静に手元で立式するのは難しいです。
いつか堂々と私はこうやって考えました!とE問題の解説を書いてみたいです。


(以降の問題文は割愛)

最後に

一見しただけで難しそうなD問題だったので必ず水色以上の難易度だろうと決めつけてE、F問題によそ見をしたことが敗因でした。 が、よそ見したF問題も面白そうだったのでいつかリベンジしたい所存です。

蒸し暑いですが健康面に気を付けて各位頑張りましょう。AHCもあるし。 Caffeineholicでした。

← 活動記事一覧に戻る