はじめに
こんにちは。Caffeineholicです。今回は5完できました!E問題まで解説できればと思います。頑張って何とか5完できたのに、そこまでパフォーマンスが出なかったという印象でした。つまり実力が大きくは伸びていないということになります。毎週コンテストに出るだけではいけないのかもしれません。最近は課題に追われているために(という言い訳をして)ADTにもサークルにも参加してないのが響いているのでしょうか。 何はともあれ感想と解法を共有させていただきます。
結果サマリ
- ABC479
- WCPC参加人数: 6人
- 各問題の最速解答者(実AC時刻):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 0:39 | Java24 (OpenJDK 24.0.2) |
| B | nsubaru | 2:00 | Java24 (OpenJDK 24.0.2) |
| C | nsubaru | 6:53 | Java24 (OpenJDK 24.0.2) |
| D | nsubaru | 15:35 | Java24 (OpenJDK 24.0.2) |
| E | nsubaru | 39:07 | Java24 (OpenJDK 24.0.2) |
| F | - | - | - |
| G | - | - | - |
今週の出題
ABC479-A
問題文を表示
問題文
長さ の整数列 が与えられます。
の奇数番目の項の総和を求めてください。
より厳密には、 を満たす全ての奇数 にわたる の総和を求めてください。
制約
- 入力は全て整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
コードだけ載せて割愛します。
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
問題文を表示
問題文
高橋君は、連続する 日間の天気を、各日について「晴れ」か「雨」かで記録しました。
高橋君の記録は長さ の文字列 として以下の形式で与えられます。
-
の ( ) 文字目は、記録開始から 日目の天気を表します。
- の 文字目が
Sであるとき、その日の記録は「晴れ」でした。 - の 文字目が
Rであるとき、その日の記録は「雨」でした。
- の 文字目が
高橋君が「雨」を連続して記録した日数の最大値を求めてください。
ただし、高橋君が「雨」を一度も記録しなかった場合、答えは であるとします。
制約
- は を満たす整数
- は
SとRからなる長さ の文字列
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
時間を取られがちなfor文での添え字操作。やりたくありませんが200点ビハインドで突き進むわけにはいきません。 “R”を見つけたかどうかをフラグで管理してフラグと 番目の値の状態に応じてカウント。 初心者さんのために詳しい解説を書こうと思いましたが、自力でB問題を解こうとしている方にとってはもはや必要ない内容だと考えました。
ABC479-C
問題文を表示
問題文
個のおかずがあります。
個目のおかずのおいしさは 、体積は です。
あなたは、選んだおかずの体積の総和が 以下となるようにいくつかのおかずを選び、弁当箱に詰めます。
選んだおかずのおいしさの総和として考えられる最大値を求めてください。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
ナップザック問題をDP(動的計画法)で解くときと酷似した問題設定に、身体が勝手に反応してコードを書き始めた競プロプレイヤーも一定数いたはずです。が、制約が と極めて小さいことからすべての弁当の選び方 パターンを総当たりする探索が間に合うことが分かります。 bit全探索と呼ばれる実装の仕方が最初に思いつきます。何事もなくACできました。
個人的には「実装できますか?」よりも「思いつけますか?」を問われる問題のほうが解いていて楽しいのですが、本番中はそんなことを宣う前に全速力でD問題に突進します。
ABC479-D
問題文を表示
問題文
個のマスが一直線上に並んでおり、左から順に の番号が付いています。
あなたがマス にいるとき、以下のいずれかの移動をすることができます。
-
なる整数 を選び、マス に移動する。この移動にはコストが かかる。
-
なる整数 を選び、マス に移動する。この移動にはコストが かかる。
個のクエリが与えられます。それぞれについて答えてください。各クエリは以下の形式です。
- 整数 が与えられる。あなたがマス から移動を繰り返してマス に辿り着くまでに必要なコストの合計の最小値を求めよ。
制約
- 各クエリについて
- 各クエリについて
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
ただし、 は 番目のクエリであり、以下の形式で与えられる。
出力
行出力せよ。
行目には、 番目のクエリに対する答えを出力せよ。
一直線上に並んだマスの 番目から見て右側のどこかのマスにワープするためには 、左側のどこかのマスにワープするためには のコストがかかると決まっている状態で、マス からマス へ到達するために必要な最小コストを高速に求めよ、という問題でした。
結論から言うとマス からマス へ向かうとき、「マス がある方向へ、コスト (または ) をかけて飛ぶ」「いったんマス がない方向に飛んで、その方向にあるマスのうち『マス がある方向にワープするコスト (または ) が最小のものを利用する』」の2通りしか考慮しなくてよいです。
ある区間の総和を高速に求められるデータ構造としてセグメント木に目を付け、実装しました。 累積和でも実現可能であることには後から気づきましたが、ACできたのでよしとします。
ABC479-E
問題文を表示
問題文
頂点に の番号がついた 頂点の木があります。ここで、 は奇数です。
辺にも の番号がついており、辺 は頂点 を結んでいます。
各頂点 には変数 が設定されており、はじめは全ての頂点 について です。
これから、 について順に以下の操作を行います。
-
まず、辺 を取り除く。その結果、木は つの連結成分に分かれる。
-
含まれる頂点の数がより多い連結成分に含まれる全ての頂点 について、 に を加算する。
- なお、 は奇数なので、含まれる頂点の数がより多い連結成分は一意に定まる。
-
最後に、辺 を復元する。
全ての操作を行った後の、各頂点に設定された変数の値 を求めてください。
制約
- 入力は全て整数
- は を満たす奇数
- 与えられるグラフは木である
入力
入力は以下の形式で標準入力から与えられる。
出力
最終的な各変数の値を、以下の形式で出力せよ。
木構造において、無理やりノード を「上」、それにつながるノードの方向を「下」と解釈して考えました。 玉を糸でつないで問題文の木構造を再現したときに、 と書かれた玉を指でつまみ上げたら全体が下に垂れ下がりますよね。 そのイメージを持ったまま、グラフ上のあるノードについて、それより「上」とそれより「下」にどんな数字を伝播させたいかを保存して行くのが良いでしょう(本番の私の提出コードには「右」「左」と書いてありますが。人間の脳って面白いですね)。
やることとしては、 DFSでそれぞれのノードの親(真「上」にあるノード)を調べて保存→それを使って(DFS順を逆にたどる)各ノード上下のどちらにノードが多いか調べて保存→それを使って自分より「下」のノードすべてにその情報を伝播させることをDFS順で行うでした。
ABC479-F
問題文を表示
問題文
人の人が数直線上に立っています。人にはそれぞれ の番号が付けられており、はじめ人 は座標 にいます。ただし、 はそれぞれ相異なります。
あなたは、以下の操作を繰り返し行うことができます。
- 人を 人選ぶ。その人が現在いる座標を としたとき、 または に移動させる。ただし、移動先に人がいる場合は、移動先にいる人を同時に座標 に移動させる。
各人 が座標 にいる状態になるまでの操作回数として考えられる最小値を求めてください。ただし、 はそれぞれ相異なります。
制約
- のとき かつ
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
F問題はとても面白そうだったのですが、時間がなかったのとE問題が解けそうだったのとで本番中に取り組むことは断念しました。 まだ解けていないので、後からじっくり見ようと思います。
G問題については、割愛させていただきます。
最後に
割ける時間が限られてきそうですが、どうやったらさらにレートが上がるのか模索していきたいと思っています。 なんにせよ今回もレートが上がって良かったです。Caffeineholicでした。