WCPC
AtCoder

ARC--219参加記

2025年5月10日 N nsubaru

ABC457回

はじめに

こんにちは。
この記事を担当します、nsubaruです! ARC—がついに開催しましたね!レート対象なので、強気のRatedで参加しました! 結果は2問解いて-15という苦い結果になりました。正直この問題のレベル感で2完してマイナスになるとは思っておらず、厳しい世界だなと感じました。 とりあえず、せっかく2問解けたので今回も所感を書いていこうと思います!

結果サマリ

問題参加者名タイム言語
Ansubaru73:23Java
Bnsubaru104:46Java
C---
D---
E---
F---
G---

今週の出題

ARC219-A

問題文を表示

NN 個の相異なる文字列 S1,,SNS_1, \dots, S_N が与えられます。これらの文字列はいずれも、0, 1 のみからなる長さ MM の文字列です。
0, 1 のみからなる長さ MM の文字列 TT のうち、以下の条件を満たすものが存在するか判定し、あれば一例を構築してください。

  • どの文字列 SiS_i も、TT と少なくとも 1 箇所で文字が一致する。
  • より厳密には、任意の整数 ii (1iN1 \le i \le N) に対して、ある整数 xix_i (1xiM1 \le x_i \le M) が存在し、SiS_ixix_i 文字目と TTxix_i 文字目が一致する。

制約

  • N,MN, M は整数
  • 1N2×1041 \le N \le 2 \times 10^4
  • 1M1001 \le M \le 100
  • SiS_i は 0, 1 のみからなる長さ MM の文字列
  • S1,,SNS_1, \dots, S_N は相異なる

入力
入力は以下の形式で標準入力から与えられる。
NN MM
S1S_1
\vdots
SNS_N

出力
問題文中の条件を満たす TT が存在しないならば、No を出力せよ。
問題文中の条件を満たす TT が存在するならば、以下の形式で出力せよ。
Yes
TT
条件を満たす TT が複数存在する場合、どれを出力しても正解と判定される。

まず、未証明ACを通してしまったことをここに謝罪します! 僕の解法は、まだ共通する文字がない文字列の中で、多数派の文字を選ぶという方法で解けました。 こうすると、条件を満たしていない文字列の数を各ステップで確実に半分以下に減らすことができるためこれで無理なら無理かなみたいに考えていました。 コンテスト後、Geminiさん曰くあっているだそうです。とまあそんな貪欲ならもっと速く解けたのではというのはおいておいて、次に行きます。

ARC219-B

問題文を表示

整数 NN(1,2,,N)(1,2,\ldots,N) の順列 P=(P1,P2,,PN)P=(P_1,P_2,\ldots,P_N) が与えられます。 (1,2,,N)(1,2,\ldots,N) の順列 Q=(Q1,Q2,,QN)Q=(Q_1,Q_2,\ldots,Q_N) に対して、以下の操作をちょうど 11 回行うことにより得られる順列の中で辞書順最小の順列を Q=(Q1,Q2,,QN)Q'=(Q_1',Q_2',\ldots,Q_N') とします:

  • 1lrN1\le l\le r\le N を満たす整数の組 (l,r)(l,r) を選び、Ql,Ql+1,,QrQ_l,Q_{l + 1},\ldots,Q_r を反転させる。より厳密には、QQ(Q1,Q2,,Ql1,Qr,Qr1,,Ql,Qr+1,Qr+2,,QN)(Q_1,Q_2,\ldots,Q_{l - 1} , Q_r,Q_{r - 1},\ldots,Q_l,Q_{r + 1},Q_{r + 2},\ldots,Q_N) で置き換える。 Q=PQ'=P となる (1,2,,N)(1,2,\ldots,N) の順列 QQ の個数を 998244353998244353 で割ったあまりを求めてください。 TT 個のテストケースが与えられるので、それぞれについて答えを求めてください。

制約

  • 1T1\le T
  • 1N5×1051\le N\le 5\times 10^5
  • PP(1,2,,N)(1,2,\ldots,N) の順列
  • 全てのテストケースにおける NN の総和は 5×1055\times 10^5 以下
  • 入力される値は全て整数

入力
入力は以下の形式で標準入力から与えられる。
TT
case1case_1
case2case_2
\vdots
caseTcase_T
各テストケースは以下の形式で与えられる。
NN
P1P_1 P2P_2 \ldots PNP_N

出力
各テストケースに対する答えを順に改行区切りで出力せよ。

条件を満たす順列が何個あるかというのを998244353998244353で割った余りを求めるという数え上げの問題でした。

まず、辞書順で最小になるように反転をさせるということについて考えます。 辞書順で最小になるためには出来るだけ小さい値を前に持っていくということです。つまり順列QQの先頭から見ていき、既に整列している部分(辞書順で最小の順列(1,2,3,,n1,2,3,\cdots,n)となっている部分)でなくなった最初の場所に、辞書順に次の値が来るように反転させるとことで実現できます。 この次の値の場所は、1,2,3,Q4,,Qn1,2,3,Q_4,\cdots,Q_n のようになっている場合、次の値というのは4となり、Q4QnQ_4 \sim Q_nまでのどこかに置けばよいので、n - 4 + 1通りであるとわかります。

次に、この反転させた順列QQPPが一致しているための条件を考えます。 この順列QQは辞書順で最小になるように反転させました。順列QQの先頭の方は整列しているため、順列PPも先頭が整列している必要があります。 実際に操作を行うのはQQであるため、順列PPを先頭から見たときどれだけ整列しているかを見ることで、どこまでQQを操作することで一致させれるかを判定できます。

このように考えることで、無事解くことができました。既に順列PPが整列している場合は特別に処理が必要であったため1ペナはしましたが、、、

ARC219-C以降

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

最後に

水色コーダーになったらリベンジします!!! nsubaruでした。来週も頑張りましょう。

← 活動記事一覧に戻る