WCPC
AtCoder

ABC476参加記

2026年9月19日 C Caffeineholic

前回の参加記(ABC472回)

はじめに

こんにちは。最近サークル活動に参加できていないCaffeineholicがお送りします。 最近個人ブログを書き始めたり、バイトで顧客に向けた文章を書く必要が出てきたりと、文章を書く力の必要性を感じています。 今回は5完できましたがそこまで難しい問題ではなかったようで、想定よりパフォーマンスが出なかったという印象でした。 所感と考察を簡単に書いていこうと思います。

結果サマリ

問題参加者名タイム言語
ACaffeineholic1:01Python
Bnsubaru2:46Java
Cnsubaru5:45Java
Dnsubaru38:22Java
Ensubaru18:02Java
F---
G---

今週の出題

A問題

問題文を表示

問題文

英小文字からなる文字列 SS が与えられます。

以下のようにして決まる文字列 TT を出力してください。

  • SS の末尾の文字が e である場合、 TT は SS の末尾に r を付け加えた文字列である。
  • SS の末尾の文字が e でない場合、 TT は SS の末尾に er を付け加えた文字列である。

制約

  • SS は英小文字からなる文字列
  • SS の長さは 11 以上 100100 以下

入力

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

SS

出力

答えを出力せよ。

if文と文字列操作の復習です。問題文の指示に従ってコードを書ければ、ACできる問題だったと思います。

B問題

問題文を表示

問題文

SS は英小文字からなる長さ NN の文字列です。

TT は英小文字および * からなる長さ NN の文字列です。

SS が TT にマッチするとは、TT に含まれる * をそれぞれ好きな英小文字で置き換えることで TT を SS に一致させられることをいいます。

SS が TT にマッチするかどうかを判定してください。

制約

  • 1≤N≤1001 \leq N \leq 100
  • SS は英小文字からなる長さ NN の文字列
  • TT は英小文字および * からなる長さ NN の文字列

入力

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

NN
SS
TT

出力

SS が TT にマッチするならば Yes を、マッチしないならば No を 11 行で出力せよ。

SS ,TTの長さが異なる場合は置き換えという操作をいくら行っても一致させることができないので No を出力し、それ以外の場合について考えます。 SS と TT の各文字について、異なっているかどうか、TiT_i が * であるかどうかを見ていきます。 異なっており、かつ TiT_i が * ではなければ、その時点で No を出力し、No を最後まで出力しなければ Yes を出力することで正解できます。

C問題

問題文を表示

問題文

33 以上の整数 NN と長さ NN の正整数列 A=(A1,A2,…,AN)A=(A_1,A_2,\dots,A_N) が与えられます。

k=3,4,…,Nk=3,4,\dots,N それぞれに対し以下の問題を解いてください:

A1,A2,…,AkA_1,A_2,\dots,A_k を降順に並べたとき、前から 33 番目にくる値を求めてください。

制約

  • 3≤N≤5×1053 \leq N \leq 5 \times 10^5
  • 1≤Ai≤1091 \leq A_i \leq 10^9
  • 入力される値は全て整数

入力

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

NN
A1A_1 A2A_2 …\dots ANA_N

出力

N−2N-2 行出力せよ。

ii 行目 (1≤i≤N−2)(1 \leq i \leq N-2) には k=i+2k=i+2 とした時の答えを出力せよ。

優先度付きキューを利用するのが最も簡単な解法だと思います。優先度付きキューを一つ用意し、最初の3文字を格納しておきます。 k=3...Nk=3 ... N について、

という作業を繰り返すだけで解けます。わからなかった方は、各言語での優先度付きキューの使い方と仕様を調べておきましょう。

D問題

問題文を表示

問題文

AtCoder 王国では、11 ドル紙幣と KK ドル紙幣の 22 種類の紙幣が流通しています。

AtCoder 王国にある J 社の全自動食堂では、デザートやドリンクが商品として売られています。

J 社の全自動食堂には、NN 個のデザートを売るデザート販売機と、MM 個のドリンクを売るドリンク販売機があります。 デザートには 11 から NN までの、ドリンクには 11 から MM までの番号が付けられています。

デザート ii の価格は AiA_i ドル、ドリンク jj の価格は BjB_j ドルです。

支払いに使う紙幣として、デザート販売機は 11 ドル紙幣と KK ドル紙幣の両方を受け入れますが、ドリンク販売機は KK ドル紙幣しか受け入れません。 どちらの販売機も、お釣りはすべて 11 ドル紙幣のみを使って返します。 同じ商品を 22 個以上買うことはできません。

高橋君は 11 ドル紙幣 XX 枚と KK ドル紙幣 YY 枚を持って J 社の全自動食堂にやってきました。

高橋君が手持ちの紙幣で買える商品の組合せにおいて、購入できる商品数の最大値を求めてください。

制約

  • 1≤N≤2×1051 \leq N \leq 2 \times 10^5
  • 1≤M≤2×1051 \leq M \leq 2 \times 10^5
  • 2≤K≤1092 \leq K \leq 10^9
  • 0≤X≤10150 \leq X \leq 10^{15}
  • 0≤Y≤1090 \leq Y \leq 10^9
  • 1≤Ai≤1091 \leq A_i \leq 10^9 (1≤i≤N)(1 \leq i \leq N)
  • 1≤Bj≤1091 \leq B_j \leq 10^9 (1≤j≤M)(1 \leq j \leq M)
  • 入力される値はすべて整数

入力

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

NN MM KK
XX YY
A1A_1 …\dots ANA_N
B1B_1 …\dots BMB_M

出力

答えを出力せよ。

今回解けた問題の中で最も難しいと感じました。高いレートを獲得したければ、こういう問題に時間をかけてはいけない気がします。 ドリンクを先に買うことができればそのあとはシンプルに、kドル札を1ドル札k枚としてデザートを何個買えるかを求められそうです。 したがって、ドリンクを買う数を全探索して、そのそれぞれについてデザートを何個買えるかを二分探索で高速に求めました。 前処理として累積和を用意しておかなければいけない点や問題文に使われている単語が多くて情報の処理が追いつかないといった点から、かなり時間を取られてしまいました。 順位表からも、ある程度の人は私と同じようにA->B->C->Eを先に解いてからD問題に取り掛かったことが読み取れます。

E問題

問題文を表示

問題文

(1,2,…,N)(1,2,\dots,N) の順列 P=(P1,P2,…,PN)P=(P_1,P_2,\dots,P_N) と長さ MM の整数列 L=(L1,L2,…,LM)L=(L_1,L_2,\dots,L_M), R=(R1,R2,…,RM)R=(R_1,R_2,\dots,R_M) が与えられます。

この順列 PP に対し、i=1,2,…,Mi=1,2,\dots,M の順に以下の操作を行います:

PLi,PLi+1,…,PRiP_{L_i},P_{L_i+1},\dots,P_{R_i} のうち、最小の値をもつ要素と最大の値をもつ要素の位置を入れ替える。

MM 回の操作が終わった後の PP の各要素を求めてください。

制約

  • 2≤N≤2×1052 \leq N \leq 2 \times 10^5
  • 1≤M≤2×1051 \leq M \leq 2 \times 10^5
  • PP は (1,2,…,N)(1,2,\dots,N) の順列
  • 1≤Li<Ri≤N1 \leq L_i < R_i \leq N
  • 入力される値は全て整数

入力

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

NN MM
P1P_1 P2P_2 …\dots PNP_N
L1L_1 R1R_1
L2L_2 R2R_2
⋮\vdots
LML_M RMR_M

出力

MM 回の操作が終わった後の PP の各要素を先頭から順に空白区切りで出力せよ。

ある区間の最大値や最小値を高速に求める必要がある、要素を更新する必要がある、ということからセグメント木を連想しました。このデータ構造を利用すればこの問題の「更新されるべき要素の値」が分かります。 それが分かれば、各要素の値とインデックスを紐づけておいてそれも同時に更新していけば解けることが分かります。 D問題よりも複雑でない、データ構造の知識があれば解ける問題でした。逆に落とさなくてよかったと思っています。

F問題以降は割愛とさせていただきます。

最後に

以上、Caffeineholicでした。代表にもそろそろ執筆を手伝ってほしいものです。またお会いしましょう。

← 活動記事一覧に戻る