はじめに
こんにちは。ARC219回に引き続き、nsubaruです。
今回も1回生の追い上げが凄まじくそのうち抜かれそうで気が気でなりません!
しかし、今まで解けたためしのない種類のE問題をACでき結果には大満足です!この調子でいけば8月くらいまでには水色かな~
結果サマリ
- ABC458
- WCPC参加人数: 6人
- 各問題の最速解答者(ペナルティ無し):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | kotomiko | 1:09 | C++ |
| B | kotomiko | 3:41 | C++ |
| C | nsubaru | 8:03 | Java |
| D | nsubaru | 11:59 | Java |
| E | nsubaru | 94:14 | Java |
| F | - | - | - |
| G | - | - | - |
今週の出題
ABC458-A
問題文を表示
問題文
英小文字からなる文字列 と正の整数 が与えられます。 の長さは 以上です。
の先頭と末尾から 文字ずつ取り除いて得られる文字列を求めてください。
制約
- は英小文字からなる文字列
- は整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
やるだけのA問題です!
色々やる方法はあると思いますが、実際に文字列を削除したりするのは面倒なのでここでは特定範囲の出力を行うことにしましょう。
0-indexedで考えると、nからlen-n-1番目までを出力すればよいです。
ABC458-B
問題文を表示
問題文
行 列のグリッドがあります。上から 行目、左から 列目のマスをマス と表します。
マス とマス が辺で隣接するとは、 が成り立つことをいいます。
すべてのマスについて、そのマスに辺で隣接するマスの個数を求めてください。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを以下の形式で出力せよ。
ここで、 はマス に辺で隣接するマスの個数を表す。
グリッドの各マスの隣接数マスの個数を出力せよ、という問題です。 最初、入力例1を見て「角が2、枠が3、中が4」だと推測しましたが、見事に入力例2に引っかかりました。そこですぐに全探索をする方針へと転換しました。 微妙に時間がかかりましたが、隣接4マスを探索するベクトルと範囲チェックの関数を用意しておけば簡単に書けますね! この2つはテンプレコードに必須だと思っています!
ABC458-C
問題文を表示
問題文
英大文字からなる文字列 が与えられます。以下の条件を全て満たす の部分文字列 (連続する部分列) がいくつあるか求めてください。
- 奇数個の文字からなる。
- 中央の文字が C である。厳密には、抜き出した部分文字列が 文字からなるとき、その 文字目が C である。
ただし、部分文字列が文字列として一致していても、抜き出した文字の位置が異なる場合、それぞれ別に数えます。
制約
- は英大文字からなる長さ 以上 以下の文字列
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
また部分文字列系の問題です。(最近C問題、文字列系が多い気がする?と思ったけど全然そんなことない。)
解法は簡単ですね。文字列を探索していき、i番目にCを見つけたら、答えにmin(i + 1, n - i)を加算していくだけです。
0-indexedで考えるとこのi+1やn-iのところでごちゃごちゃしてバグりそうですが、こればっかりは慣れですね!
ABC458-D
問題文を表示
問題文
黒板に整数 が つ書かれています。
個のクエリが与えられるので、順に処理してください。 個目 のクエリは以下の通りです。
つの整数 が与えられる。黒板に新たに つの整数 を書く。
その後、黒板に書かれた 個の整数の中央値を出力する。
制約
- 入力される値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
出力
行出力せよ。
行目には、 番目のクエリに対する答えを出力せよ。
「黒板に書いていく系の問題だ!」と思いきや、ただの中央値の問題かいっていう。
リストに値を追加するにはだし、Setを使うと重複する値を消してしまう、じゃあどう求めるんだと頭を悩ませた人も多いと思います。
私は自作のMultiSetを用いて、index取得を行うことで無事に解き切ることができました。
案外この問題は色々解法が思いつきます。 思いついた解法の中でやっている人がいたら面白いなと思ったのが座圧+BIT(セグ木)二分探索で、某有名人の方も使っていましたね! 過剰の合わせ技でごり押し感があって面白い。他にもPriorityQueueを2つ使うなどなど。
ABC458-E
問題文を表示
問題文
以下の条件をすべて満たす長さ の数列 としてあり得るものの個数を で割ったあまりを求めてください。
- は を 個、 を 個、 を 個含む。
- 隣接する要素の差の絶対値は 以下である。つまり、 を満たす任意の整数 について、 が成り立つ。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
D問題を解いて約12分。運命のE問題は数列の数え上げの問題です。
どうせDPだ!と約30分考えたのち、頭の中に数学科の友達がこういう問題は仕切りを上手く置くといいみたいなことを言っていたなーと急に頭によぎり、よし1を基準に考えようとなりました。
ここで基準を2にしていればもっと簡単な解き方になっていたのですが、それは置いておいて。
1を基準にした場合次のようなことを考えることで解けます。
まず、1が並んでいる列に対し、1と1の間に2を置くことを考えます。このとき、3が置ける場所は 2と2の間のみです。
この 2と2の間の個数は2の置き方によって様々変わりますが、何個の 1と1の間を使用して、2を置くかを考えることで一意に定めることができます。
より一般的に言うと、 個の間から個を選んだ時、この個それぞれに最低1つ2が置いてあるようにしたときの3の置き方は、以下の式で表すことができます。
- は 個の
1と1の間をi個を選ぶ組み合わせ。 - は 個の
1と1の間に2を重複を許して 個配置する組み合わせ。(2が個なのはi個の2はi箇所の1と1の間にすでに1つずつ配置しているため) - は
2と2の間が 個出来るため、その間に重複を許して3を個配置する組み合わせ。
残りの2パターン(1の片端に2が最低1つ置いてある場合と、1の両端に2が最低1つ置いてある場合)も同様に考えることでこの問題を解くことができます。
ABC458-F以降
(これ以降の問題文は割愛します)
最後に
今回実は全ての問題がCから始まっていました!気づきましたか?何かあったんでしょうか。
そんなことはさておき、とりあえず代表Rated待ってます!nsubaruでした!