WCPC
AtCoder

ABC466参加記

2026年7月11日 N nsubaru

前回の参加記(ABC465回)

はじめに

こんにちは。nsubaruです。

直近3回のABCでレートが-66となってしまい、次この記事を書くときは入水したときかなと思っていたのですが、全然そんなことはありませんでした。 ただ自分が負け越している間に当サークルに緑コーダーが2人も増えて大変喜ばしいことだなと思っています。 まあそんな緑コーダーたちに今回は久々に勝てたのでこの記事を書いています。

結果サマリ

問題参加者名タイム言語
ATwil30:42Rust
Bkotomiko2:38C++
Ckotomiko27:43C++
Dnsubaru13:00Java
Ensubaru83:09Java
F---
G---

今週の出題

ABC466-A

問題文を表示

問題文
NN 個の選択肢があります。
あなたは、これらの中から 11 つの選択肢を選びます。あなたが ii 番目の選択肢を選んだときの嬉しさは XiX_i です。
どの選択肢を選んでも嬉しさが負になる場合は Yes を、そうでない場合は No を出力してください。

制約

  • 2N102 \leq N \leq 10
  • 100Xi100-100 \leq X_i \leq 100
  • 入力される値はすべて整数

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

出力
問題文中の指示に従って YesNo のいずれかを出力せよ。

全ての要素が条件をみたすかどうかを求める問題です。
単純な問題なのでそこまでどうでも良いのですが、コーディング速度向上のために↓のような1行コードを速く書きたいのですが、なかなかベストなコードが書けませんね。

Rustはこんなコードが書けそうなことはこの前知ったのですが、他の言語ではどう書くのか少し気になります。

コードは一部抜粋です(Java)。

// 提出したコード
out.println(IntStream.range(0, n).filter(_ -> sc.nextInt() < 0).count() == n);
// もう少し短く書ける!
out.println(IntStream.range(0, n).allMatch(_ -> sc.nextInt() < 0));

ABC466-B

問題文を表示

問題文
NN 個のボールがあります。
ii 番目のボールの色は CiC_i、大きさは SiS_i です。ここで、色は 1,2,,M1, 2, \ldots, M の整数で表されます。
k=1,2,,Mk = 1, 2, \ldots, M について、色 kk のボールの大きさの最大値を出力してください。ただし、色 kk のボールが存在しない場合は -1 と出力してください。

制約

  • 1N,M1001 \leq N, M \leq 100
  • 1CiM1 \leq C_i \leq M
  • 1Si1001 \leq S_i \leq 100
  • 入力される値はすべて整数

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

NN MM
C1C_1 S1S_1
C2C_2 S2S_2
\vdots
CNC_N SNS_N

出力
k=1,2,,Mk = 1, 2, \ldots, M の順に、色 kk のボールが存在するならば色 kk のボールの大きさの最大値を、存在しないならば -1 を空白区切りで出力せよ。

mapを使って解く問題です。毎回B問題はこれくらい単純な問題を置いてくれたらいいのですが。

解法は-1で初期化したサイズMMの配列を用いて解きます。 mapでも配列でも解法は変わりません。色をインデックスに、大きさを値として最大値を更新していくことで解けます。

ABC466-C

問題文を表示

問題文
この問題は インタラクティブな問題(あなたが作成したプログラムとジャッジプログラムが標準入出力を介して対話を行う形式の問題)です。
数直線上に、点 11, 22, \ldots, NNこの順に 左から右に並んでいます。
最初、あなたには整数 NN のみが与えられます。
その後、あなたはジャッジに以下の質問を 2N\bm{2N} 回まで行うことができます。

  • 1i<jN1 \leq i \lt j \leq N を満たす整数 i,ji,j を選び、点 ii と点 jj の距離が 11 以下であるか質問する。

距離が 11 以下の 22 点組の個数、すなわち 1i<jN1\leq i \lt j \leq N をみたす整数の組 (i,j)(i,j) であって、点 ii と点 jj の距離が 11 以下であるようなものの個数を出力してください。

制約

  • 2N1032 \leq N \leq 10^3
  • NN は整数

入出力
最初に、点の個数を表す整数 NN を標準入力から受け取ってください。

NN

次に、あなたはジャッジに対して問題文中の質問を 2N2N 回まで繰り返すことができます。
質問は、以下の形式で標準出力に出力してください。 ここで、i,ji,j1i < jN1 \leq i \lt j \leq N を満たす整数である必要があります。

? ii jj

これに対する応答として、以下のどちらかが標準入力から与えられます。

Yes

No

ここで、Yes ならば点 ii と点 jj の距離が 11 以下であることを、No ならば点 ii と点 jj の距離が 11 より大きいことを表します。
問題の答え XX が求まったら、解答を以下の形式で出力してください。 その後、ただちにプログラムを終了してください。

! XX

インタラクティブな問題!?となり、2秒くらい問題を見た後すぐにD問題に行きました。
実際、解法も全く思い浮かばず二分探索…?となっていました。

その後も考察に時間がかかり、左側を基準にして右側を二分探索、その後に右側を基準にして左側を二分探索する…あれしゃくとり法じゃねってなりました。

この間約20分程度で本当に時間を無駄にしました。
そのうえ、実装したしゃくとり法には無駄があったらしく質問数が2N2Nを越えてしまっていたようで、2WAになり散々でした。

3N3Nくらいにしてくれれば良かったのですが。ひとまず解けたので良しです。

ABC466-D

問題文を表示

問題文
NNNN 列のマス目があります。
最初、マス目の上には何も置かれていません。
その状態から始めて、高橋君がマス目に対して MM 回の操作を順に行います。ii 回目 (1iM)(1\leq i\leq M) の操作は以下のとおりです。

  • 上から RiR_i 行目のマスに置かれているコマをすべて取り除く。
  • 次に、左から CiC_i 列目のマスに置かれているコマをすべて取り除く。
  • 最後に、上から RiR_i 行目かつ左から CiC_i 列目のマスにコマを置く。 MM 回の操作の後でマス目に置かれているコマの個数を出力してください。

制約

  • 1N3×1051 \leq N \leq 3\times 10^5
  • 1M3×1051 \leq M \leq 3\times 10^5
  • 1RiN1 \leq R_i \leq N
  • 1CiN1 \leq C_i \leq N
  • 入力はすべて整数

入力
入力は以下の形式で標準入力から与えられる。
NN MM
R1R_1 C1C_1
R2R_2 C2C_2
\vdots
RMR_M CMC_M

出力
MM 回の操作の後でマス目に置かれているコマの個数を出力せよ。

圧倒的にCより簡単なDでした。

コマを置くという操作と、そのコマとおなじ行と列のコマをすべて取り除くという操作をMM回行う問題です。

まず、コマを置いたときそのコマが後々消される可能性があるなと考えます。 その次に、一番後ろのコマに注目すると、このコマは削除されず、その行と列にこれまで置いたコマは全て削除されるということに気が付きます。

ここまで考えるとコマを置く順番を後ろから見ることで、コマを置いたときにそのコマが最終的に残るものなのかを判定していくことができます。

ABC466-E

問題文を表示

問題文
NN 枚のカードが並んでいます。カードには 1,2,,N1, 2, \ldots, N の番号が付けられています。
カード ii の表面には整数 AiA_i が、裏面には整数 BiB_i が書かれています。はじめ、すべてのカードは表面が上を向いています。
あなたは、以下の操作を高々 KK 回行うことができます。

  • 1lrN1 \leq l \leq r \leq N なる整数 l,rl, r を選ぶ。lirl \leq i \leq r なる各整数 ii について、カード ii を裏返す。ただし、カードを裏返すとは、操作を行う前に下を向いている面を上に向けることを指す。

操作を終えた後、各カードの上を向いている面に書かれている数の総和として考えられる最大値を求めてください。

制約

  • 1N2×1051 \leq N \leq 2 \times 10^5
  • 1K101 \leq K \leq 10
  • 1Ai,Bi1091 \leq A_i, B_i \leq 10^9
  • 入力される値はすべて整数

入力
入力は以下の形式で標準入力から与えられる。
NN KK
A1A_1 B1B_1
A2A_2 B2B_2
\vdots
ANA_N BNB_N

出力
答えを出力せよ。

ぱっと見難しそうだなという問題でした。

制約K10K \leq 10ということから、O(SK)\mathcal{O}(|S|K)のDPかなという前提で考えました。

まず考えたことは、K=1K=1の解がk=2k=2になったときにどのように遷移するのかみたいなことを考えました。 しかし、k=1k=1だとしてもどの区間を反転させる必要があるかを愚直に求めることができないなと思い、kkを増やしていくようなDPではないことが分かりました。

なら、SSの先頭から分割数がKKを超えないように値を最大化していくみたいに考えます。 紙に書いて考えたらわかりやすいのですが、どの区間が表か裏かを考えるとこの表と裏の区間は最大でも 2×K+12\times K + 1 個しかないことが分かります。

あとはそれを前からDPするだけなので実装は簡単に出来ました。

最後に

C問題で面喰らいましたが、久々に勝てて良かったです。

まだまだ精進不足でE問題も得意不得意が多く、あと少しで水色が結構遠いなという感触です。 ICPCも終わりAtCoderにかけれる時間も増えたので、これを期にレートマイナス月間に終止符を打てたらなと思います。

あとサークルメンバーみんな強くなりすぎているのでそろそろ抜かれそうで怖いです。

← 活動記事一覧に戻る