はじめに
こんにちは。
この記事を担当します、nsubaruです!
ARC—がついに開催しましたね!レート対象なので、強気のRatedで参加しました!
結果は2問解いて-15という苦い結果になりました。正直この問題のレベル感で2完してマイナスになるとは思っておらず、厳しい世界だなと感じました。
とりあえず、せっかく2問解けたので今回も所感を書いていこうと思います!
結果サマリ
- ARC219
- WCPC参加人数: 5人
- 各問題の最速解答者(ペナルティ無し):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 73:23 | Java |
| B | nsubaru | 104:46 | Java |
| C | - | - | - |
| D | - | - | - |
| E | - | - | - |
| F | - | - | - |
| G | - | - | - |
今週の出題
ARC219-A
問題文を表示
個の相異なる文字列 が与えられます。これらの文字列はいずれも、0, 1 のみからなる長さ
の文字列です。
0, 1 のみからなる長さ の文字列 のうち、以下の条件を満たすものが存在するか判定し、あれば一例を構築してください。
- どの文字列 も、 と少なくとも 1 箇所で文字が一致する。
- より厳密には、任意の整数 () に対して、ある整数 () が存在し、 の
文字目と の 文字目が一致する。
制約
- は整数
- は 0, 1 のみからなる長さ の文字列
- は相異なる
入力
入力は以下の形式で標準入力から与えられる。
出力
問題文中の条件を満たす が存在しないならば、No を出力せよ。
問題文中の条件を満たす が存在するならば、以下の形式で出力せよ。
Yes
条件を満たす が複数存在する場合、どれを出力しても正解と判定される。
まず、未証明ACを通してしまったことをここに謝罪します! 僕の解法は、まだ共通する文字がない文字列の中で、多数派の文字を選ぶという方法で解けました。 こうすると、条件を満たしていない文字列の数を各ステップで確実に半分以下に減らすことができるためこれで無理なら無理かなみたいに考えていました。 コンテスト後、Geminiさん曰くあっているだそうです。とまあそんな貪欲ならもっと速く解けたのではというのはおいておいて、次に行きます。
ARC219-B
問題文を表示
整数 と の順列 が与えられます。 の順列 に対して、以下の操作をちょうど 回行うことにより得られる順列の中で辞書順最小の順列を とします:
- を満たす整数の組 を選び、 を反転させる。より厳密には、 を で置き換える。 となる の順列 の個数を で割ったあまりを求めてください。 個のテストケースが与えられるので、それぞれについて答えを求めてください。
制約
- は の順列
- 全てのテストケースにおける の総和は 以下
- 入力される値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
各テストケースは以下の形式で与えられる。
出力
各テストケースに対する答えを順に改行区切りで出力せよ。
条件を満たす順列が何個あるかというのをで割った余りを求めるという数え上げの問題でした。
まず、辞書順で最小になるように反転をさせるということについて考えます。 辞書順で最小になるためには出来るだけ小さい値を前に持っていくということです。つまり順列の先頭から見ていき、既に整列している部分(辞書順で最小の順列()となっている部分)でなくなった最初の場所に、辞書順に次の値が来るように反転させるとことで実現できます。 この次の値の場所は、 のようになっている場合、次の値というのは4となり、までのどこかに置けばよいので、n - 4 + 1通りであるとわかります。
次に、この反転させた順列とが一致しているための条件を考えます。 この順列は辞書順で最小になるように反転させました。順列の先頭の方は整列しているため、順列も先頭が整列している必要があります。 実際に操作を行うのはであるため、順列を先頭から見たときどれだけ整列しているかを見ることで、どこまでを操作することで一致させれるかを判定できます。
このように考えることで、無事解くことができました。既に順列が整列している場合は特別に処理が必要であったため1ペナはしましたが、、、
ARC219-C以降
(これ以降の問題文は割愛します)
最後に
水色コーダーになったらリベンジします!!! nsubaruでした。来週も頑張りましょう。