はじめに
こんにちは。
初めまして!ShoboiNamaeと申します。今回、入緑を記念して記事を書かせていただけることになりました!(やったね!)
新入部員として、当たり障りのないことを書いていければと思います。
結果サマリ
- ABC457
- WCPC参加人数: 6人
- 各問題の最速解答者(ペナルティ無し):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 0:25 | Java |
| B | nsubaru | 1:53 | Java |
| C | ShoboiNamae | 9:12 | C++ |
| D | ShoboiNamae | 39:25 | C++ |
| E | nsubaru | 97:45 | Java |
| F | - | - | - |
| G | - | - | - |
今週の出題
ABC457-A
問題文を表示
問題文
長さ の数列 が与えられます。
その後に 以上 以下の整数 が与えられます。
の値を出力してください。
制約
-
-
- 入力される値はすべて整数
入力
出力
の値を出力せよ。
A問題は1次元の配列に入力して、添え字が0から始まることに注意して出力することで解けました。
配列を使わないこともできます!(時間の無駄)
ABC457-B
問題文を表示
問題文
個の数列 が与えられます。
数列 の長さは であり です。
その後、整数 が与えられます。 の値を出力してください。
制約
の総和は 以下
入力される値はすべて整数
入力
出力
の値を出力せよ。
Aと同様に配列の操作が本質の問題ですが、こちらは2次元配列を使う問題でした。
数列 の長さがそれぞれ違うので入力が複雑になるところが難しかったと思います。
解説を読んでみると、固定長配列を作ろうとした人がWAになるような問題設定にされていたようです。よく考えられてるなあ。
ABC457-C
問題文を表示
問題文
整数 と 個の整数列 、 長さ の整数列 が与えられます。整数列 の長さは であり です。また、 が保証されます。
と から以下の手順で整数列 を構成します。
- を長さ0の整数列とする。
- の順に以下の操作を行う:
- の末尾に を連結させる操作を 回行う。
の値を求めてください。
制約
- 入力される値はすべて整数
入力
出力
答えを出力せよ。
解説文を表示(長くなったのでたたみました)
この問題は入力や数列のある要素の値を求める点でB問題に似ていますがだいぶ難易度が違います。
愚直に数列を作ると間に合わないorメモリ超過するので数列Bを作らずに解く工夫が必要でした。
まず、 「 の末尾に を連結させる操作を 回行う」という点に着目します。すると、数列 の中に 「 が繰り返されている部分」が、 から までの 箇所あることが分かります。
このとき、 数列 の「 が繰り返されている部分」を、数列 の第 群と定義します。数列 の第 項が属する群と、その群における位置を求めます。
問題文から、第 群の長さは です。よって、第1群から第群の最後の要素までの項数は、 項です。
このことから、数列 の第 項が属する群を第 群とすると、 が成り立ちます。for文などで、 が満たされる間 を1から増やしていくことで を求めることができます。
が分かってしまえば群の中の第何項目なのかは、 で簡単に求まります。
肝心の出力すべき要素についても、第 群で長さ の数列 が繰り返されていることを考えると、 を で割ったあまりを考えればよさそうです。
ただし、大抵のプログラミング言語の配列は 0-indexed (添え字が0始まり)なので、添え字を指定するときには注意が必要です。
と、なぜか無駄に解説を書いてしまったのですが、本番中はこんなに考えてません。
私は読解力がとても低いので問題文を読むのに一番苦労しました。あと、最後の添え字もなんとなくでやってしまった。通ったからいいけれども。
あと、全然関係ないんですが、0-indexedって競プロ界隈限定の呼び方なんですかね? 検索しても競プロのサイトばかりヒットするのはなぜだろう…
まとめると、この問題は難しかったということです。
ABC457-D
問題文を表示
問題文
長さ の数列 と整数 が与えられます。
あなたは次の操作を0回以上 回以下行うことができます。
- を満たす整数 を1つ選び、 に を加える。
操作後の数列に対する としてありうる最大値を求めてください。
制約
- 入力される値はすべて整数
入力
出力
答えを出力せよ。
またまた数列が出てきました。今日は数列デーなのか?
私は先週のABCでD問題が解けなかったので何としても解きたいところでした。
まだまだ経験が浅く、コンテスト中は「DはDPのD!」とか言ってDPを考えていましたが、途中で天啓があり、にぶたんだと確信したので爆速でコードを書き、しっかりオーバーフローでWAになって踊りました。
その後、考えるのを放棄し、 __int128_t 型を使うという脳筋プレーでACできました。なので、今回一番面倒だったのは __int128_t の出力関数を作ることでした。
といっても、10で割ってあまり出力して10で割って…を繰り返すだけの関数ですが。
Pythonはいいよなあ。デフォルトが多倍長整数で。
後から聞いた話ですが、最小値の最大化とか、最大値の最小化とか、そういう類の問題は大体にぶたんらしいです。もしにぶたんできなかったら、その後にDPとか貪欲を考えるのがいいそうです。
やっぱり O(log N) は魅力的だー。
ABC457-E
問題文を表示
問題文
個のマスが左右一列に並んでいます。左から 番目 のマスをマス と呼びます。
枚の布があり、布 を敷くとマス からマス までを覆うことができます。
個のクエリに答えてください。 番目 のクエリでは整数 が与えられるので、以下の問題に答えてください。
- 枚の布の中からちょうど2枚の布を選んで敷くことで、以下の条件を満たすことができるか判定せよ。
- マス からマス までは1枚以上の布で覆われており、それ以外のマスは布で覆われていない。
制約
- 入力される値はすべて整数
入力
出力
各クエリに対する答えを改行区切りで出力せよ。
各クエリでは、条件を満たすように2枚の布を選ぶことができる場合は Yes を、できない場合は No を出力せよ。
私はコンテスト中に解けませんでした。ランキングを見てみると、 nsubaru 先輩が解いてる!! さすがすぎる!!
一応私がコンテスト中に考えたことを書いておきます。
実行時間が2.5秒と、少し長かったので重めの計算量を通すと推測し、前処理ですべての覆える範囲を探索するコードを提出しましたがもちろんTLEでした。さすがに O(M^2) は通らない。
全探索じゃないっぽいなー、また二分探索? 今日二分探索デーか? というところまでは考えましたが、どうすればいいのか分からなかったので成す術なく終わりました。
ABC457-F以降
(これ以降の問題は割愛します)
最後に
E問題を解けなかったことが悔しいですが、なんとか入緑できてよかったです。
至らない点もあったかと思いますが、最後まで読んでいただきありがとうございました。