acm模版
這裡使用二分套二分查詢即可。一般的二分查詢是通過下標範圍查詢,而二分套二分是為了求兩個陣列組合乘積的問題,查詢第k
大的值,這裡我們需要通過資料的範圍查詢,而不是下標的範圍,這裡需要兩次快排。
需要強調的一點是資料範圍問題!!!一定要使用long long
型,避免資料溢位!!!
#include
#include
#include
/* * 二分套二分
* 陣列a同陣列b組合乘積,二分查詢第k大
*/typedef
long
long ll;
using
namespace
std;
const
int maxn = 5e4 + 10;
ll n, k;
ll a[maxn];
ll b[maxn];
// 查詢小於x的元素個數
ll check(ll x)
else
}ans += j;
}return ans;
}int main(int argc, const
char * argv)
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
ll ans = 0;
ll key = n * n - k + 1;
ll low = a[1] * b[1]; // 初始最小值
ll high = a[n] * b[n]; // 初始最大值
while (high - low > 1)
else
}cout
<< ans << '\n';
return
0;}
《二分查詢》 51nod 1105 第K大的數
1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...
51nod 1105第K大的數
1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a ...
51nod 1105 第K大的數
1105 第k大的數 1.0 秒 131,072.0 kb 20 分 3級題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a n 1 b 1 a n 1 ...