64,645
社区成员
发帖
与我相关
我的任务
分享
//这是对偶的写法
#include <iostream>
#include <deque>
#include <vector>
#include <functional>
#include <algorithm>
#include <cstdio>
using namespace std;
int data1[10005], data2[10005];
int main(void)
{
int n, m;
int result = 0;
int cas;scanf("%d", &cas);
while (cas--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) scanf("%d", data1+i);
for (int i = 0; i < n; ++i) scanf("%d", data2+i);
int curr = 0;
sort(data1, data1+n);
sort(data2, data2+n);
int l = data1[0] * data2[0], r = data1[n-1] * data2[n-1];
while (l <= r)
{
int mid = (l + r) >> 1;
int gt = 0;
for (int i = 0; i < n; ++i)
{
int a = 0, b = n - 1;
while (a <= b)
{
int c = (a + b) >> 1;
int t = data1[i] * data2[c];
if (t < mid) a = c + 1;
else b = c - 1;
}
gt += n - a;
if (gt >= m) break;
}
if (gt >= m) l = mid + 1;
else r = mid - 1;
}
printf("%d\n", r);
}
return 0;
}
#include <iostream>
#include <deque>
#include <vector>
#include <functional>
#include <algorithm>
#include <cstdio>
using namespace std;
int data1[10005], data2[10005];
int main(void)
{
int n, m;
int result = 0;
int cas;scanf("%d", &cas);
while (cas--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) scanf("%d", data1+i);
for (int i = 0; i < n; ++i) scanf("%d", data2+i);
int curr = 0;
sort(data1, data1+n);
sort(data2, data2+n);
int l = data1[0] * data2[0], r = data1[n-1] * data2[n-1];
m = n * n - m + 1;
while (l <= r)
{
int mid = (l + r) >> 1;
int lt = 0;
for (int i = 0; i < n; ++i)
{
int a = 0, b = n - 1;
while (a <= b)
{
int c = (a + b) >> 1;
int t = data1[i] * data2[c];
if (t > mid) b = c - 1;
else a = c + 1;
}
lt += a;
if (lt > m) break;
}
if (lt >= m) r = mid - 1;
else l = mid + 1;
}
printf("%d\n", l);
}
return 0;
}