久保 勉強会
今日のテーマ 二分探索 nubo.icon
利点
Nサイズの配列の探索がO(logN)でできる!
実装が楽
どんな時に使うのか
数値の組み合わせ(特にソートした方が良い場合)
ABC212 C問題 2週間前とかのやつ https://atcoder.jp/contests/abc212/tasks/abc212_c
ABC212 C問題にサンプルコード載っけてます
~を満たす最大 (最小) の値を求めよ系の問題
解 x を仮定して可能かを判定する問題に置き換えて
解 x が可能となるような最大 (最小) の x を求める
今回の問題 (数値の組み合わせ)
ABC077 C問題 https://atcoder.jp/contests/abc077/tasks/arc084_a
https://scrapbox.io/files/6117a04798b22a001d2c6759.png
関数の部分を覚えれば、コピペで使える!!
code:swift
let N = Int(readLine()!)!
var A = readLine()!.split(separator: " ").map{Int($0)!}
var B = readLine()!.split(separator: " ").map{Int($0)!}
var C = readLine()!.split(separator: " ").map{Int($0)!}
A = A.sorted() //ソート
B = B.sorted() //ソート
C = C.sorted() //ソート
func upper_bound(key:Int) -> Int{ //Cの祭壇の候補を調べる二分探索
//ここからはテンプレ
var left = -1
var right = N
while(right - left > 1){
let mid = left + (right - left) / 2
if Cmid>key{ //条件式のみ変更する!!
right = mid
}else{
left = mid
}
}
//ここまでテンプレ
return (N - 1) - right + 1
}
func lower_bound(key:Int) -> Int{ //Aの祭壇の候補を調べる二分探索
var left = -1
var right = N
while(right - left > 1){
let mid = left + (right - left) / 2
//基本的にはこの条件が変わる
if Amid<key{
left = mid
}else{
right = mid
}
}
return left + 1
}
var ans = 0
for i in B{ //B一つ一つについて、AとCの候補を調べる!
let up = upper_bound(key: i)
let low = lower_bound(key: i)
ans += up * low
}
print(ans)
勉強会.pptx
時間があれば、、、
~を満たす最大 (最小) の値を求めよ系の問題
ABC023 D問題 射撃王
参考サイト
https://qiita.com/drken/items/97e37dd6143e33a64c8c
https://qiita.com/drken/items/2f56925972c1d34e05d8
#二分探索
#勉強会