二分探索ドリルのサムネイル
差が D 以上のペアの個数 Erlang(Beta)編(paizaランク A 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

部活で、実力の差が大きい部員どうしをペアにして特別なトレーニングをすることになりました。部員 N 人の実力スコアを昇順に並べた整数列 A_1, A_2, ..., A_N があります(A_1 ≦ A_2 ≦ ... ≦ A_N)。

顧問の先生は「どのくらいスコアが離れた 2 人を組ませるか」をまだ決めかねているため、Q 通りの基準 D_1, D_2, ..., D_Q を試すことにしました。

各クエリ D_q について、スコアの差が D_q 以上(A_j - A_i ≧ D_q、i < j)となる 2 人の組 (i, j) が何通りできるかを求め、その総数を出力してください。

各クエリの答えを、与えられた順に 1 行ずつ出力してください。

1 つのクエリについてすべての組を二重ループで調べると最大で約 N × N / 2 回の比較が必要になり、それを Q 回くり返すと間に合いません。各 i について「A_i + D_q 以上のスコアを持つ部員が最初に現れる位置」を二分探索で求めると、その位置から後ろにいる部員はすべて A_j - A_i ≧ D_q を満たすため、まとめて人数を数えられます。

入力される値

入力は以下のフォーマットで与えられます。

N Q
A_1 A_2 ... A_N
D_1 D_2 ... D_Q


・1 行目には整数 N と整数 Q が空白区切りで与えられます。

・2 行目には N 個の整数 A_1, A_2, ..., A_N が空白区切りで与えられます。A は昇順に並んでいます。

・3 行目には Q 個の整数 D_1, D_2, ..., D_Q が空白区切りで与えられます。

・入力は合計で 3 行からなり、入力値最終行の末尾に改行が 1 つ入ります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

各クエリ D_q について、スコアの差が D_q 以上(A_j - A_i ≧ D_q、i < j)となる 2 人の組 (i, j) の総数を、与えられた順に 1 行ずつ出力してください。出力の最後は改行し、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・2 ≦ N ≦ 10000

・1 ≦ Q ≦ 300

・1 ≦ A_i ≦ 1000000000

・1 ≦ D_q ≦ 1000000000

・A は昇順に並んでいる(A_1 ≦ A_2 ≦ ... ≦ A_N)

入力例1

5 3
1 3 5 8 10
4 2 9

出力例1

6
10
1

入力例2

4 2
5 6 7 8
100 1

出力例2

0
6

問題一覧へ戻る

  1. paizaトップ
  2. レベルアップ問題集
  3. 二分探索ドリル(言語選択)
  4. 問題一覧 Erlang(Beta)編
  5. 差が D 以上のペアの個数 Erlang(Beta)編
ページの先頭へ戻る