JPRSプログラミングコンテスト2026#1(AtCoder Beginner Contest 442)に参加しました。
結果
A,B,Cの3問正解でした。
D問題はぱっと見セグメントツリーの問題かなと思いつつ、 ライブラリを用意してないしそこまで複雑なことは本当に必要なのかなと思いつつ、一旦飛ばしてE問題を先に解いた。
E問題は極座標に変換して、角度でソートしてどうこうすれば解けそうだなと思って解いてた。WAが2件あってどんなコーナーケースに引っかかったのかわからず頭を抱えてた…
A - Count .
文字列が与えられるのでiとjの個数を数える問題。
線形探索でiとjの数をカウントしていけば良いだけの問題。
B - Music Player
初期状態は音量0、再生は停止中から始まり、
音量を上げる、下げる、再生・停止の状態を入れ替える
の3種類のクエリが与えられるので、各クエリを処理した後に、音量3以上で再生中かどうかを答える問題。
音量と再生状態を管理しながら、クエリが与えられるたびにメンテし、 条件を満たすかどうかを確認して答えを出力し続けるだけの問題。
音量を下げた時はmax(下げた後の音量、0)で更新すると、if文を使わずに0より小さい時は0にするというのが簡単に実装できる。
再生状況はboolで管理して、状態を入れ替えるクエリが来た時は!で反転させることでメンテが楽になる
new_state = !now_state みたいな感じで
C - Peer Review
問題文を簡単に言い換えると、無向グラフが与えられるので、 指定されたノードiに対して ノードi+隣接ノード以外のノードから3つを選択する組み合わせ数を答える問題。
組み合わせの具体例ではなく結果の数値だけがわかれば良いので、 与えられる入力から各ノードの隣接ノード数を数えて、 全iに対してノードi+隣接ノード以外のノードから3つを選択する組み合わせを計算して出力すれば良い。
問題文を読んで要するにグラフの問題と変換できれば解ける問題だと思う。
D - Swap and Range Sum
解けそうで解けなかった問題。
長さNの数列が与えられる。
2種類のクエリがQ個与えられるので順番に処理する問題
クエリ1 x番目とx+1番目の要素を入れ替える
クエリ2 l番目からr番目までの要素の和を出力する。
クエリ2を計算量少なめに処理できないとTLEすることになりそう。
あらかじめ累積和を計算して、クエリ1の影響を調整して出力すれば良いかなと思って実装してみたけど、
やっぱりTLEになった。
解説を読んで確かにと思ったけど、 隣の要素を入れ替えたところで累積和はスワップが起きた0~xまでの1要素分の累積和しか影響しない。 0~x-1までの累積和はスワップの影響を受けないし、右端がx+1以降の累積和もスワップの影響を受けない
だからスワップと同時に0~xまで分の累積和1要素だけをメンテすれば、累積和は常に最新の状態を維持できていると言える。
累積和が最新の状況を反映できているので、クエリ2はO(1)で処理できるので時間内に全部のクエリを処理できるようになる。
E - Laser Takahashi
解けそうで解けなかった問題。
2次元平面上にN体のモンスターがいる。 原点から時計回りに回転し、モンスターAからモンスターBまでの範囲の角度にいるモンスターを除去する。
AとBが指定されたときに何体のモンスターが除去されるかをQ回答える問題。
考えた方針としては、 平面座標から極座標に変換して、角度だけを取り出してソートしておく。 モンスターA,Bが指定されると、A,Bの座標から角度を計算し、前述したソート済みの配列から指定された範囲の要素数を数える。 開始と終了の位置関係から、数えた要素数をそのまま出力したり、Nから引いた数を出力したりする。 (計算した範囲が除去する対象だったり、除去された後に残る要素だったりするので場合分けして対応)
解説を読むと、方針自体はあっていたみたい。特定の場合に微妙に誤差が出ているのかなあ。