WCPC
AtCoder

ABC479参加記

2026年10月11日 C Caffeineholic

前回の参加記(ABC478)

はじめに

こんにちは。Caffeineholicです。今回は5完できました!E問題まで解説できればと思います。頑張って何とか5完できたのに、そこまでパフォーマンスが出なかったという印象でした。つまり実力が大きくは伸びていないということになります。毎週コンテストに出るだけではいけないのかもしれません。最近は課題に追われているために(という言い訳をして)ADTにもサークルにも参加してないのが響いているのでしょうか。 何はともあれ感想と解法を共有させていただきます。

結果サマリ

問題参加者名タイム言語
Ansubaru0:39Java24 (OpenJDK 24.0.2)
Bnsubaru2:00Java24 (OpenJDK 24.0.2)
Cnsubaru6:53Java24 (OpenJDK 24.0.2)
Dnsubaru15:35Java24 (OpenJDK 24.0.2)
Ensubaru39:07Java24 (OpenJDK 24.0.2)
F---
G---

今週の出題

ABC479-A

問題ページ

問題文を表示

問題文

長さ NN の整数列 A=(A1,A2,…,AN)A=(A_1,A_2,\dots,A_N) が与えられます。

AA の奇数番目の項の総和を求めてください。

より厳密には、 1≤i≤N1 \le i \le N を満たす全ての奇数 ii にわたる AiA_i の総和を求めてください。

制約

  • 入力は全て整数
  • 1≤N≤1001 \le N \le 100
  • 1≤Ai≤1001 \le A_i \le 100

入力

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

NN
A1A_1 A2A_2 …\dots ANA_N

出力

答えを出力せよ。

コードだけ載せて割愛します。

N = int(input())
A = list(map(int, input().split()))

ans = 0
for i in range(N):
    if i % 2 == 0:
        ans += A[i]

print(ans)

ABC479-B

問題ページ

問題文を表示

問題文

高橋君は、連続する NN 日間の天気を、各日について「晴れ」か「雨」かで記録しました。

高橋君の記録は長さ NN の文字列 SS として以下の形式で与えられます。

  • SS の ii ( 1≤i≤N1 \le i \le N ) 文字目は、記録開始から ii 日目の天気を表します。

    • SS の ii 文字目が S であるとき、その日の記録は「晴れ」でした。
    • SS の ii 文字目が R であるとき、その日の記録は「雨」でした。

高橋君が「雨」を連続して記録した日数の最大値を求めてください。

ただし、高橋君が「雨」を一度も記録しなかった場合、答えは 00 であるとします。

制約

  • NN は 1≤N≤1001 \le N \le 100 を満たす整数
  • SS は S と R からなる長さ NN の文字列

入力

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

NN
SS

出力

答えを出力せよ。

時間を取られがちなfor文での添え字操作。やりたくありませんが200点ビハインドで突き進むわけにはいきません。 “R”を見つけたかどうかをフラグで管理してフラグと ii 番目の値の状態に応じてカウント。 初心者さんのために詳しい解説を書こうと思いましたが、自力でB問題を解こうとしている方にとってはもはや必要ない内容だと考えました。

ABC479-C

問題ページ

問題文を表示

問題文

NN 個のおかずがあります。

ii 個目のおかずのおいしさは AiA_i、体積は BiB_i です。

あなたは、選んだおかずの体積の総和が WW 以下となるようにいくつかのおかずを選び、弁当箱に詰めます。

選んだおかずのおいしさの総和として考えられる最大値を求めてください。

制約

  • 1≤N≤201 \leq N \leq 20
  • 1≤W≤1091 \leq W \leq 10^9
  • 1≤Ai,Bi≤1091 \leq A_i, B_i \leq 10^9
  • 入力される値はすべて整数

入力

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

NN WW
A1A_1 B1B_1
A2A_2 B2B_2
⋮\vdots
ANA_N BNB_N

出力

答えを出力せよ。

ナップザック問題をDP(動的計画法)で解くときと酷似した問題設定に、身体が勝手に反応してコードを書き始めた競プロプレイヤーも一定数いたはずです。が、制約が N≤20N\le20 と極めて小さいことからすべての弁当の選び方 2N2^N パターンを総当たりする探索が間に合うことが分かります。 bit全探索と呼ばれる実装の仕方が最初に思いつきます。何事もなくACできました。

個人的には「実装できますか?」よりも「思いつけますか?」を問われる問題のほうが解いていて楽しいのですが、本番中はそんなことを宣う前に全速力でD問題に突進します。

ABC479-D

問題ページ

問題文を表示

問題文

NN 個のマスが一直線上に並んでおり、左から順に 1,2,…,N1, 2, \ldots, N の番号が付いています。

あなたがマス ii にいるとき、以下のいずれかの移動をすることができます。

  • 1≤j<i1 \leq j < i なる整数 jj を選び、マス jj に移動する。この移動にはコストが LiL_i かかる。

  • i<j≤Ni < j \leq N なる整数 jj を選び、マス jj に移動する。この移動にはコストが RiR_i かかる。

QQ 個のクエリが与えられます。それぞれについて答えてください。各クエリは以下の形式です。

  • 整数 s,ts, t が与えられる。あなたがマス ss から移動を繰り返してマス tt に辿り着くまでに必要なコストの合計の最小値を求めよ。

制約

  • 2≤N≤3×1052 \leq N \leq 3 \times 10^5
  • 1≤Q≤3×1051 \leq Q \leq 3 \times 10^5
  • 1≤Li≤1091 \leq L_i \leq 10^9 (2≤i≤N)(2 \leq i \leq N)
  • 1≤Ri≤1091 \leq R_i \leq 10^9 (1≤i≤N−1)(1 \leq i \leq N - 1)
  • 各クエリについて 1≤s,t≤N1 \leq s, t \leq N
  • 各クエリについて s≠ts \neq t
  • 入力される値はすべて整数

入力

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

NN QQ
L2L_2 L3L_3 …\ldots LNL_N
R1R_1 R2R_2 …\ldots RN−1R_{N - 1}
query1\text{query}_1
query2\text{query}_2
⋮\vdots
queryQ\text{query}_Q

ただし、queryi\text{query}_i は ii 番目のクエリであり、以下の形式で与えられる。

ss tt

出力

QQ 行出力せよ。

ii 行目には、ii 番目のクエリに対する答えを出力せよ。

一直線上に並んだマスの ii 番目から見て右側のどこかのマスにワープするためには RiR_i 、左側のどこかのマスにワープするためには LiL_i のコストがかかると決まっている状態で、マス ss からマス tt へ到達するために必要な最小コストを高速に求めよ、という問題でした。

結論から言うとマス ii からマス jj へ向かうとき、「マス jj がある方向へ、コスト RiR_i (または LiL_i) をかけて飛ぶ」「いったんマス tt がない方向に飛んで、その方向にあるマスのうち『マス tt がある方向にワープするコスト LiL_i (または RiR_i) が最小のものを利用する』」の2通りしか考慮しなくてよいです。

ある区間の総和を高速に求められるデータ構造としてセグメント木に目を付け、実装しました。 累積和でも実現可能であることには後から気づきましたが、ACできたのでよしとします。

ABC479-E

問題ページ

問題文を表示

問題文

頂点に 1,2,…,N1,2,\dots,N の番号がついた NN 頂点の木があります。ここで、 NN は奇数です。

辺にも 1,2,…,N−11,2,\dots,N-1 の番号がついており、辺 ii は頂点 Ai,BiA_i,B_i を結んでいます。

各頂点 ii には変数 xix_i が設定されており、はじめは全ての頂点 ii について xi=0x_i=0 です。

これから、 i=1,2,…,N−1i=1,2,\dots,N-1 について順に以下の操作を行います。

  • まず、辺 ii を取り除く。その結果、木は 22 つの連結成分に分かれる。

  • 含まれる頂点の数がより多い連結成分に含まれる全ての頂点 vv について、 xvx_v に ii を加算する。

    • なお、 NN は奇数なので、含まれる頂点の数がより多い連結成分は一意に定まる。
  • 最後に、辺 ii を復元する。

全ての操作を行った後の、各頂点に設定された変数の値 x1,x2,…,xNx_1,x_2,\dots,x_N を求めてください。

制約

  • 入力は全て整数
  • NN は 3≤N≤2×105−13 \le N \le 2 \times 10^5 - 1 を満たす奇数
  • 1≤Ai<Bi≤N1 \le A_i < B_i \le N
  • 与えられるグラフは木である

入力

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

NN
A1A_1 B1B_1
A2A_2 B2B_2
⋮\vdots
AN−1A_{N-1} BN−1B_{N-1}

出力

最終的な各変数の値を、以下の形式で出力せよ。

x1x_1 x2x_2 …\dots xNx_N

木構造において、無理やりノード 00 を「上」、それにつながるノードの方向を「下」と解釈して考えました。 玉を糸でつないで問題文の木構造を再現したときに、 00 と書かれた玉を指でつまみ上げたら全体が下に垂れ下がりますよね。 そのイメージを持ったまま、グラフ上のあるノードについて、それより「上」とそれより「下」にどんな数字を伝播させたいかを保存して行くのが良いでしょう(本番の私の提出コードには「右」「左」と書いてありますが。人間の脳って面白いですね)。

やることとしては、 DFSでそれぞれのノードの親(真「上」にあるノード)を調べて保存→それを使って(DFS順を逆にたどる)各ノード上下のどちらにノードが多いか調べて保存→それを使って自分より「下」のノードすべてにその情報を伝播させることをDFS順で行うでした。

ABC479-F

問題ページ

問題文を表示

問題文

NN 人の人が数直線上に立っています。人にはそれぞれ 1,2,…,N1, 2, \ldots, N の番号が付けられており、はじめ人 ii は座標 SiS_i にいます。ただし、SiS_i はそれぞれ相異なります。

あなたは、以下の操作を繰り返し行うことができます。

  • 人を 11 人選ぶ。その人が現在いる座標を xx としたとき、x−1x - 1 または x+1x + 1 に移動させる。ただし、移動先に人がいる場合は、移動先にいる人を同時に座標 xx に移動させる。

各人 ii が座標 TiT_i にいる状態になるまでの操作回数として考えられる最小値を求めてください。ただし、TiT_i はそれぞれ相異なります。

制約

  • 1≤N≤2×1051 \leq N \leq 2 \times 10^5
  • 0≤Si,Ti≤1090 \leq S_i, T_i \leq 10^9
  • i≠ji \neq j のとき Si≠SjS_i \neq S_j かつ Ti≠TjT_i \neq T_j
  • 入力される値はすべて整数

入力

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

NN
S1S_1 S2S_2 …\ldots SNS_N
T1T_1 T2T_2 …\ldots TNT_N

出力

答えを出力せよ。

F問題はとても面白そうだったのですが、時間がなかったのとE問題が解けそうだったのとで本番中に取り組むことは断念しました。 まだ解けていないので、後からじっくり見ようと思います。

G問題については、割愛させていただきます。

最後に

割ける時間が限られてきそうですが、どうやったらさらにレートが上がるのか模索していきたいと思っています。 なんにせよ今回もレートが上がって良かったです。Caffeineholicでした。

← 活動記事一覧に戻る