WCPC
AtCoder

ABC472参加記

2026年8月22日 C Caffeineholic

前回の参加記(ABC471回)

はじめに

こんにちは。 Caffeineholic です。 およそ二週間前の記事を書いていますが、私の図太さは他の人のそれとは段違いですので、記事の日付を調整することでごまかそうと思います。 小学校時代の必殺技、「したけど忘れました」が思い出されます。この記事に原稿料が出れば喜んで毎週書くのですが、まあ文章の練習になっているのでよしとしましょう。

グリッドやグラフといった(比較的)得意な分野が出題されたからか、5問解くことができましたので今回も考察と所感を書いていきますよ。

結果サマリ

問題参加者名タイム言語
Ansubaru0:45Java
BCaffeineholic3:10Python
Cnsubaru9:33Java
Dnsubaru23:08Java
ECaffeineholic74:51Python
F---
G---

今週の出題

ABC472-A

問題ページ: A問題

問題文を表示

問題文

英大文字からなる文字列 SS が与えられます。

SS のうち A 以外の文字をすべて . に置き換えた文字列を出力してください。

制約

  • SS は英大文字からなる長さ 11 以上 100100 以下の文字列

入力

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

SS

出力

答えを出力せよ。

for文と配列を理解していれば解ける問題かと思います。A問題でこんなにfor文が要りそうな問題は少し珍しいかも…?

ABC472-B

問題ページ: B問題

問題文を表示

問題文

棒が 11 本あります。この棒には切れ込みが N1N-1 箇所入っており、切れ込みによって NN 個の部分に分かれています。 それぞれの部分の長さは端から順に L1,L2,,LNL_1, L_2, \dots, L_N です。 切れ込みを 11 箇所選び、そこで棒を折って 22 本の棒にするとき、折ってできる 22 本の棒の長さの差の絶対値の最小値を求めてください。 ただし切れ込みの幅は無視でき、折ってできる 22 本の棒の長さはそれぞれの棒に含まれる部分の長さの総和になります。

制約

  • 2N1002 \leq N \leq 100
  • 1Li1051 \leq L_i \leq 10^5
  • 入力はすべて整数

入力

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

NN
L1  LNL_1 \ \ldots \ L_N

出力

答えを出力せよ。

左の切れ込みから順に、実際に折った場合の値を求め最小値を保存していきます。

ABC472-C

問題ページ: C問題

問題文を表示

問題文

高橋君は NN 日間の帰省で実家に滞在しています。 実家では毎日おやつが用意されており、ii 日目のおやつのカロリーは AiA_i です。 高橋君は体調管理のために、直近 MM 日間で食べたおやつのカロリーの合計が KK を超えないならばおやつを食べることを繰り返します。 具体的には i=1,2,,Ni=1,2,\dots,N の順に、以下のルールに従って ii 日目のおやつを食べるかどうかを決定します。

  • ii 日目のおやつを食べたと仮定したときに max(iM+1,1)\max(i-M+1, 1) 日目から ii 日目までの間に食べたおやつのカロリーの合計が KK 以下ならば、ii 日目のおやつを実際に食べる。そうでないならば、ii 日目のおやつを食べない。

i=1,2,,Ni=1,2,\dots,N それぞれについて、高橋君が ii 日目のおやつを食べるかどうかを判定してください。

制約

  • 1MN2×1051 \leq M \leq N \leq 2 \times 10^5
  • 1K10151 \leq K \leq 10^{15}
  • 1Ai1091 \leq A_i \leq 10^9
  • 入力はすべて整数

入力

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

N M KN \ M \ K
A1 A2  ANA_1 \ A_2 \ \dots \ A_N

出力

NN 行出力せよ。 ii 行目には高橋君が ii 日目のおやつを食べる場合 Yes と、食べない場合 No と出力せよ。

問題文通りにシミュレーションすることで解ける問題でした。 「 ii 番目のおやつを食べたかどうか」を管理する必要がありますが、特定のアルゴリズムが必要とされる問題ではありませんでした。

ABC472-D

問題ページ: 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) は爆弾マスです。 また、空マス (i,j)(i,j) について ii 行目にも jj 列目にも爆弾マスが存在しないとき、そのマスを 安全な空マス と呼びます。

11 回の移動で今いるマスから、上下左右に隣り合う空マスに移動することができます(爆弾マスには移動できません)。以下の条件を満たす空マス (i,j)(i,j) の数を求めてください。

  • (i,j)(i,j) から KK 回以下の移動で 安全な空マス へ到達できる。

制約

  • 1H,W5×1051 \leq H, W \leq 5 \times 10^5
  • H×W5×105H \times W \leq 5 \times 10^5
  • 0KH×W10 \leq K \leq H \times W - 1
  • SiS_i.# からなる長さ WW の文字列
  • H,W,KH, W, K は整数

入力

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

H W KH \ W \ K
S1S_1
S2S_2
\vdots
SHS_H

出力

条件を満たす空マスの個数を出力せよ。

安全な空マス、安全でない空マス、爆弾マスの3種類のマスがあることを踏まえて、問題は、「K回以下で安全な空マスに到達できるマス」を数えるものです。 これは、「安全な空マスからK回以内に到達できるマス」を数える問題と捉え直すと、コーディングの見通しが良くなります。 全ての安全な空マスを視点として幅優先探索を行い、各マスに最初に到達した時にステップ数を書き込みます。すでに探索したマスに書かれている数字が最善な数字であることから再度訪れないようにでき、そうすることで計算量を O(HW)O(HW) に抑えられることが保証できます。

ABC472-E

問題ページ: E問題

問題文を表示

問題文

頂点に 11 から NN の番号がついた NN 頂点 MM 辺の単純連結無向グラフが与えられます。 ii 番目の辺は頂点 aia_i と頂点 bib_i を結んでいます。 奇数個の頂点からなる閉路が存在するか判定し、存在するならば 11 つ求めてください。 厳密には、次の条件を全て満たす整数列 (v1,v2,,vK)(v_1, v_2, \dots, v_K) が存在するか判定し、存在するなら 11 つ求めてください。

  • KK33 以上の奇数である
  • v1,v2,,vKv_1, v_2, \dots, v_K はすべて異なる
  • 1iK1 \leq i \leq K を満たす全ての整数 ii について、頂点 viv_i と頂点 vi+1v_{i+1} の間に辺がある。ただし vK+1=v1v_{K+1}=v_1 とする

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

制約

  • 1T2×1051 \leq T \leq 2 \times 10^5
  • 1N,M2×1051 \leq N, M \leq 2 \times 10^5
  • 全てのテストケースにおける NN の総和は 2×1052 \times 10^5 以下
  • 全てのテストケースにおける MM の総和は 2×1052 \times 10^5 以下
  • 1ai,biN1 \leq a_i, b_i \leq N
  • aibia_i \neq b_i
  • 与えられるグラフは単純連結無向グラフである
  • 入力される値はすべて整数である

入力

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

TT
case1\text{case}_1
case2\text{case}_2
\vdots
caseT\text{case}_T

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

N MN \ M
a1 b1a_1 \ b_1
a2 b2a_2 \ b_2
\vdots
aM bMa_M \ b_M

出力

各テストケースについて、条件を満たす数列が存在しない場合は -1 を出力せよ。存在する場合は以下の形式で 11 つ出力せよ。

KK
v1 v2  vKv_1 \ v_2 \ \dots \ v_K

条件を満たす数列が複数存在する場合、どれを出力しても正解となる。

グラフ内の奇数長のサイクルを探す問題でした。 私の解答では、始点を適当に決めて幅優先探索でグラフのノードに番号を書き込んでいきました。数字の偶奇が同じになるノード同士が結ばれることがあれば、そこに奇数長のサイクルができているといえます。 始点を一つ横のノードにずらすと他のノードに書かれた数字(探索の深さ)も同じだけずれることから、始点を適当に決めてもよいのではないかと考えていました。 サイクルの判定はすぐに書けたものの、検出したサイクルを復元するために大幅に書き直しをする羽目になり時間を取られていました。無事解答できてよかったです。

F問題以降は割愛させていただきます。

最後に

Caffeineholicでした。それではまた。

← 活動記事一覧に戻る