0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

paizaラーニング レベルアップ問題集 二分探索メニュー JavaScript ある範囲に含まれている整数の個数

Posted at

ある範囲に含まれている整数の個数 (paizaランク B 相当)

解答例(Python3 の場合参考)

前問までのbinary_search関数は、指定した値が最初に現れる位置を求めるものです。
なので、前問までで学習した lower_bound や upper_bound を用いることができます。
l_i以上の値が最初に現れる位置lpos(l positionの略)を求める→lower_bound
r_iより大きい値が最初に現れる位置rpos(r positionの略)を求める→upper_bound
l_i以上r_i以下に含まれる整数の個数は、rpos-lposで求まります。

(または、r_iが最初に現れる位置をrpos1とすると、答えはrpos1-lpos+1でも求まります)

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//二分探索の関数定義
const binary_search = (A, n, k) => {//(A : 数列, n : 数列のサイズ, k : 基準)
    // 探索範囲 [left, right]
    let left = 0;
    let right = n;
    
    // 探索範囲を狭めていく
    while (left < right) {
        // 探索範囲の中央
        const mid = Math.floor((left + right) / 2);

        if (A[mid] < k) {
            left = mid+1;
        } else {
            right = mid;
        }    
    }
    // 狭め終わったら最初に現れた位置を返す
    return right;
};

//メイン
const n = Number(lines[0]);
const A = lines[1].split(" ").map(Number).sort((a, b) => a - b);
const q = Number(lines[2]);

//各l,rについて調べる
for (let i = 1; i <= q; i++) {
  const [l, r] = lines[i + 2].split(" ").map(Number);
  const lpos = binary_search(A, n, l);
  const rpos = binary_search(A, n, r + 1);//r+1はrより大きい数
  console.log(rpos - lpos);
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?