前提
下記に示すプログラムの計算量を知りたいです。
解答では、(NlogNlogC)となっています。
NlogNまでは、二分探索とソートの処理というめぼしはつくのですが、logCの行方がわからず困っております。
該当のソースコード
C++
1#include <iostream> 2#include <vector> 3#include <algorithm> 4using namespace std; 5 6int main() { 7 long long N, K; 8 cin >> N >> K; 9 vector<long long> a(N), b(N); 10 for (int i = 0; i < N; ++i) cin >> a[i]; 11 for (int i = 0; i < N; ++i) cin >> b[i]; 12 13 // b はあらかじめソートしておく 14 sort(b.begin(), b.end()); 15 16 // 判定問題 17 auto check = [&](long long x) -> bool { 18 long long cnt = 0; 19 for (int i = 0; i < N; ++i) { 20 cnt += upper_bound(b.begin(), b.end(), x / a[i]) - b.begin(); 21 } 22 return (cnt >= K); 23 }; 24 25 // 二分探索 (right は十分大きな値に設定) 26 long long left = 0, right = 1LL<<60; 27 while (right - left > 1) { 28 long long mid = (left + right) / 2; 29 if (check(mid)) right = mid; 30 else left = mid; 31 } 32 cout << right << endl; 33}
試したこと
再度ひとつずつ、計算量を見てみるも、N、logNしか見当たらずでした。
補足情報(FW/ツールのバージョンなど)
解説には最大値とありますが、そもそもプログラム内にmax関数なんて使っていないような気がしています...
参考にした解説ページ
リンクに飛べます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。