WCPC
AtCoder

ABC458参加記

2025年5月16日 N nsubaru

前回の参加記(ABC457回)

はじめに

こんにちは。ARC219回に引き続き、nsubaruです。
今回も1回生の追い上げが凄まじくそのうち抜かれそうで気が気でなりません! しかし、今まで解けたためしのない種類のE問題をACでき結果には大満足です!この調子でいけば8月くらいまでには水色かな~

結果サマリ

問題参加者名タイム言語
Akotomiko1:09C++
Bkotomiko3:41C++
Cnsubaru8:03Java
Dnsubaru11:59Java
Ensubaru94:14Java
F---
G---

今週の出題

ABC458-A

問題文を表示

問題文
英小文字からなる文字列 SS と正の整数 NN が与えられます。SS の長さは 2N+12N+1 以上です。
SS の先頭と末尾から NN 文字ずつ取り除いて得られる文字列を求めてください。

制約

  • SS は英小文字からなる文字列
  • NN は整数
  • 2N+1S302N+1 \leq |S| \leq 30
  • 1N101 \leq N \leq 10

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

出力
答えを出力せよ。

やるだけのA問題です! 色々やる方法はあると思いますが、実際に文字列を削除したりするのは面倒なのでここでは特定範囲の出力を行うことにしましょう。 0-indexedで考えると、nからlen-n-1番目までを出力すればよいです。

ABC458-B

問題文を表示

問題文
HHWW 列のグリッドがあります。上から ii 行目、左から jj 列目のマスをマス (i,j)(i,j) と表します。
マス (x1,y1)(x_1, y_1) とマス (x2,y2)(x_2, y_2) が辺で隣接するとは、x1x2+y1y2=1|x_1 - x_2| + |y_1 - y_2| = 1 が成り立つことをいいます。
すべてのマスについて、そのマスに辺で隣接するマスの個数を求めてください。

制約

  • 1H,W501 \leq H,W \leq 50
  • 入力される値はすべて整数

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

出力
答えを以下の形式で出力せよ。
x1,1  x1,2    x1,Wx_{1,1} \; x_{1,2} \; \cdots \; x_{1,W}
x2,1  x2,2    x2,Wx_{2,1} \; x_{2,2} \; \cdots \; x_{2,W}
\vdots
xH,1  xH,2    xH,Wx_{H,1} \; x_{H,2} \; \cdots \; x_{H,W}
ここで、xi,jx_{i,j} はマス (i,j)(i,j) に辺で隣接するマスの個数を表す。

グリッドの各マスの隣接数マスの個数を出力せよ、という問題です。 最初、入力例1を見て「角が2、枠が3、中が4」だと推測しましたが、見事に入力例2に引っかかりました。そこですぐに全探索をする方針へと転換しました。 微妙に時間がかかりましたが、隣接4マスを探索するベクトル範囲チェックの関数を用意しておけば簡単に書けますね! この2つはテンプレコードに必須だと思っています!

ABC458-C

問題文を表示

問題文
英大文字からなる文字列 SS が与えられます。以下の条件を全て満たす SS の部分文字列 (連続する部分列) がいくつあるか求めてください。

  • 奇数個の文字からなる。
  • 中央の文字が C である。厳密には、抜き出した部分文字列が ll 文字からなるとき、その (l+1)/2(l+1)/2 文字目が C である。 ただし、部分文字列が文字列として一致していても、抜き出した文字の位置が異なる場合、それぞれ別に数えます。

制約

  • SS は英大文字からなる長さ 11 以上 5×1055 \times 10^5 以下の文字列

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

出力
答えを出力せよ。

また部分文字列系の問題です。(最近C問題、文字列系が多い気がする?と思ったけど全然そんなことない。) 解法は簡単ですね。文字列を探索していき、i番目にCを見つけたら、答えにmin(i + 1, n - i)を加算していくだけです。 0-indexedで考えるとこのi+1n-iのところでごちゃごちゃしてバグりそうですが、こればっかりは慣れですね!

ABC458-D

問題文を表示

問題文
黒板に整数 XX11 つ書かれています。
QQ 個のクエリが与えられるので、順に処理してください。ii 個目 (1iQ)(1\le i\le Q) のクエリは以下の通りです。
22 つの整数 Ai,BiA_i,B_i が与えられる。黒板に新たに 22 つの整数 Ai,BiA_i,B_i を書く。
その後、黒板に書かれた 2i+12i+1 個の整数の中央値を出力する。

制約

  • 1X1091\le X\le 10^9
  • 1Q2×1051\le Q\le 2\times 10^5
  • 1Ai,Bi1091\le A_i,B_i\le 10^9
  • 入力される値は全て整数

入力
入力は以下の形式で標準入力から与えられる。
XX
QQ
A1A_1 B1B_1
A2A_2 B2B_2
\vdots
AQA_Q BQB_Q

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

「黒板に書いていく系の問題だ!」と思いきや、ただの中央値の問題かいっていう。

リストに値を追加するにはO(N)O(N)だし、Setを使うと重複する値を消してしまう、じゃあどう求めるんだと頭を悩ませた人も多いと思います。 私は自作のMultiSetを用いて、index取得を行うことで無事に解き切ることができました。

案外この問題は色々解法が思いつきます。 思いついた解法の中でやっている人がいたら面白いなと思ったのが座圧+BIT(セグ木)二分探索で、某有名人の方も使っていましたね! 過剰の合わせ技でごり押し感があって面白い。他にもPriorityQueueを2つ使うなどなど。

ABC458-E

問題文を表示

問題文
以下の条件をすべて満たす長さ X1+X2+X3X_1+X_2+X_3 の数列 A=(a1,,aX1+X2+X3)A = (a_1, \cdots, a_{X_1 + X_2 + X_3}) としてあり得るものの個数を 998244353998244353 で割ったあまりを求めてください。

  • AA11X1X_1 個、22X2X_2 個、33X3X_3 個含む。
  • 隣接する要素の差の絶対値は 11 以下である。つまり、1iX1+X2+X311 \leq i \leq X_1+X_2+X_3-1 を満たす任意の整数 ii について、ai+1ai1|a_{i+1} - a_i| \leq 1 が成り立つ。

制約

  • 1X1,X2,X31061 \leq X_1, X_2, X_3 \leq 10^6
  • 入力される値はすべて整数

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

出力
答えを出力せよ。

D問題を解いて約12分。運命のE問題は数列の数え上げの問題です。

どうせDPだ!と約30分考えたのち、頭の中に数学科の友達がこういう問題は仕切りを上手く置くといいみたいなことを言っていたなーと急に頭によぎり、よし1を基準に考えようとなりました。 ここで基準を2にしていればもっと簡単な解き方になっていたのですが、それは置いておいて。

1を基準にした場合次のようなことを考えることで解けます。
まず、1が並んでいる列に対し、11の間2を置くことを考えます。このとき、3が置ける場所は 22の間のみです。 この 22の間の個数は2の置き方によって様々変わりますが、何個の 11の間を使用して、2を置くかを考えることで一意に定めることができます。

より一般的に言うと、x11x_1-1 個の間からii個を選んだ時、このii個それぞれに最低1つ2が置いてあるようにしたときの3の置き方は、以下の式で表すことができます。

x11Ci×iHx2i×x2iHx3{}_{x_1 - 1}\mathrm{C}_{i} \times {}_{i}\mathrm{H}_{x_2 - i} \times {}_{x_2 - i}\mathrm{H}_{x_3}

残りの2パターン(1の片端に2が最低1つ置いてある場合と、1の両端に2が最低1つ置いてある場合)も同様に考えることでこの問題を解くことができます。

ABC458-F以降

(これ以降の問題文は割愛します)

最後に

今回実は全ての問題がCから始まっていました!気づきましたか?何かあったんでしょうか。
そんなことはさておき、とりあえず代表Rated待ってます!nsubaruでした!

← 活動記事一覧に戻る