WCPC
AtCoder

ABC471参加記

2026年8月15日 C Caffeineholic

前回の参加記(ABC470回)

はじめに

こんにちは。Caffeineholic です。

世間は夏休みムード一色ですが、持ち前のフットワークの重さを発揮し夏を謳歌しきれていない私です。 AtCoderにだけはほぼ毎週欠かさず参加できており、今回はABCDの4問を解くことができました。しかしそろそろレートが停滞してきています。今回のE問題のような問題への対応力を磨きたいです。

結果サマリ

問題参加者名タイム言語
ACaffeineholic1:05Python
BCaffeineholic2:04Python
CShoboiNamae13:52C++
DShoboiNamae29:33C++
EShoboiNamae67:01C++
F---
G---

今週の出題

ABC471-A

問題ページ: A問題

問題文を表示

問題文

正の整数 A,BA, B が与えられます。 以下の値のうち少なくとも 11 つが 99 に等しい場合は Nine を、そうでない場合は Nein を出力してください。

  • A+BA+B
  • ABA-B
  • A×BA \times B
  • A÷BA \div B

制約

  • 1A1001 \le A \le 100
  • 1B1001 \le B \le 100
  • 入力される値はすべて整数

入力

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

A BA \ B

出力

答えを出力せよ。

長い条件式を書きました。

if a+b == 9 or a-b == 9 or a*b == 9 or a == 9*b:
    ans = "Nine"

ABC471-B

問題ページ: B問題

問題文を表示

問題文

高橋君はアンケート結果を集計しています。 アンケートには NN 人が回答し、ii 人目の回答は英字からなる文字列 SiS_i です。 このアンケートにおいて、同じ回答をした人数の最大値を求めてください。 ただし、回答の大文字と小文字は区別しません。 例えば AtCoder, ATCODER, atcoder はいずれも同じ回答とみなします。

制約

  • 1N1001 \le N \le 100
  • SiS_i は長さ 11 以上 1010 以下の、英大文字及び英小文字のみからなる文字列
  • NN は整数である

入力

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

NN
S1S_1
\vdots
SNS_N

出力

答えを出力せよ。

Pythonにはstr型を大文字に破壊的に変更する upper() メソッドがあるので、私はそれを利用しました。すべての文字列を一旦大文字に変換して比較するという考え方です。 他言語では、受け取った文字列S内のすべてのASCII値について32とOR演算することで小文字化するというテクニック(コード例の二つ目)もあるようです。

大文字 (‘A’ = 01000001) と小文字 (‘a’ = 01100001) は6ビット目のみが異なりますから、そこを揃えるという意味です。

文字列sに対する処理部分のコード例:

// 大文字なら、小文字に揃えるためにASCII差分で更新
for (char &c : s) {
    if ('A' <= c && c <= 'Z') {
        c = c - 'A' + 'a';
    }
}
// 0b00100000 = 32 と OR演算
for (char &c : s) {
    c |= 32;
}

ABC471-C

問題ページ: C問題

問題文を表示

問題文

数直線上の NN 箇所にクッキーが落ちています。 ii 番目のクッキーの落ちている座標は AiA_i です。 高橋君は最初、数直線の座標 00 にいて、NN 個のクッキー全てを拾うまで以下の行動を繰り返します。

行動:自身から最も近いクッキーのある座標(複数あるときは座標の最も小さいもの)へ移動し、そのクッキーを拾う。

全てのクッキーを拾うまでの高橋君の移動距離の合計を求めてください。

制約

  • 1N3×1051 \le N \le 3 \times 10^5
  • 109Ai109-10^9 \le A_i \le 10^9
  • Ai0A_i \neq 0
  • AiA_i は相異なる
  • 入力は全て整数である

入力

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

NN
A1  ANA_1 \ \ldots \ A_N

出力

答えを出力せよ。

解くために何がしたいのかを言語化しましょう。毎回「今いる座標から最も近いクッキーのある座標」を高速に探し、拾ったクッキーは検索対象から除外したいとなれば、Pythonの外部ライブラリsortedcontainersのSortedListクラスが利用できるとすぐに思いつけます。 C++ではデータ構造 std::set(ordered set) を利用できます。いずれも「二分探索」「要素の追加・削除」が高速にできるデータ構造です。

あるいは、開始座標が原点であること、常に現在地の左右2箇所しかチェックしなくても良いことを利用して、「負の座標にあるクッキーを順に並べたもの」「正の座標にあるクッキーを順に並べたもの」の二つのリストの端のみを見て比較し、要素を削除し続けるという解法も適切です。 こちらのほうが美しいですね。コーディング負担も少なそうです。

ABC471-D

問題ページ: D問題

問題文を表示

問題文

無尽蔵の差込口をもつ充電器があります。時刻 00 にはどの差込口も空です。 バッテリーの最大容量は VV です。バッテリーは差込口に挿入されているあいだ、残量が最大容量に達するまで速度 11 で充電されます(つまり、11 単位時間が経過するごとに残量が 11 増加します)。

QQ 個のクエリを順に処理してください。 qq 番目のクエリは以下の形式で与えられます。なお、t1<<tQt_1 < \dots < t_Q が保証されます。

  • タイプ 1 (1 tq wq1 \ t_q \ w_q): 時刻 tqt_q に、残量 wqw_q のバッテリーを 11 つ差込口に挿入する。
  • タイプ 2 (2 tq2 \ t_q): 時刻 tqt_q に、最も残量が多いバッテリーを 11 つ差込口から排出し、そのバッテリーの残量を出力する。どの差込口にもバッテリーが無い場合は代わりに 1-1 を出力する。

制約

  • 1Q3×1051 \le Q \le 3 \times 10^5
  • 1V1091 \le V \le 10^9
  • タイプ 1 のクエリにおいて、1tq1091 \le t_q \le 10^9
  • タイプ 1 のクエリにおいて、0wqV0 \le w_q \le V
  • タイプ 2 のクエリにおいて、1tq1091 \le t_q \le 10^9
  • t1<<tQt_1 < \dots < t_Q
  • 入力される値はすべて整数

入力

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

Q VQ \ V
query1\text{query}_1
\vdots
queryQ\text{query}_Q

ここで、 queryq\text{query}_qqq 番目のクエリを表し、以下の 22 種類のいずれかの形式で与えられる。

1 tq wq1 \ t_q \ w_q
2 tq2 \ t_q

出力

タイプ 2 のクエリの個数を xx として、xx 行出力せよ。

kk 行目 (1kx1 \le k \le x) には、kk 番目のタイプ 2 のクエリで出力するべき値を出力せよ。

クエリ2において、何を見て充電器残量を計算するかを考えます。現在時刻を tt 、ある充電中の充電器 ii の挿入された時刻を tit_i 、挿入された際の残量を wiw_i とおくと、充電中の充電器 ii を取り出すときの残量は wi+(tti)w_i + (t - t_i) ですから、見やすいように書き換えて t+(witi)t + (w_i - t_i) となります。この witiw_i - t_i を挿入することと、最も大きいものを取り出すことが高速にできるデータ構造を使えば、解くことができます。優先度付きキュー や前述の SortedList (std::set) が利用できると思います。

各充電器の残量は V{V} を超えないことに注意します。

ABC471-E

問題ページ: E問題

問題文を表示

問題文

11 から NN の番号がついた NN 個のボールがあります。ボール ii には整数 AiA_i が書かれています。

NN 個のボールからいくつかのボールを選ぶ方法に対して、選んだボールに書かれた数の和の 22 乗をその選び方のスコアと定めます。

NN 個のボールから KK 個を選ぶ方法 (NK)\binom{N}{K} 通り全てのスコアの総和を 998244353998244353 で割った余りを求めてください。

制約

  • 1KN2×1051 \le K \le N \le 2 \times 10^5
  • 1Ai1091 \le A_i \le 10^9
  • 入力は全て整数

入力

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

N KN \ K
A1  ANA_1 \ \dots \ A_N

出力

答えを出力せよ。

不勉強で申し訳ございませんが、まだ復習中です(次回からは多く解けたメンバーに記事を書かせ、自分はサボる作戦に出ようと画策しています)。 diffは低いので次見かけたら解けるようにしておきたいですね。式変形してある項の解への寄与数を考える問題には何度か出くわしていますが、解けずに終わることがほとんどで悔しいです。

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

最後に

なぜか休暇に入っても私のタスクは減っていませんが、力を抜けるところは抜いて、楽しいものは全力で楽しんでやっていきます。来週も頑張りましょう。 Caffeineholicでした。

← 活動記事一覧に戻る