Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây. Mỗi bạn chọn trước một dãy số gồm $n$ số nguyên. Giả sử dãy số mà bạn thứ nhất chọn là: $b_1, b_2,..., b_n$ còn dãy số mà bạn thứ hai chọn là $c_1, c_2,..., c_n$.
Mỗi lượt chơi mỗi bạn đưa ra một số hạng trong dãy số của mình. Nếu bạn thứ nhất đưa ra số hạng $b_i (1 <= i <= n)$, còn bạn thứ hai đưa ra số hạng $c_j (1 <= j <= n)$ thì giá của lượt chơi đó sẽ là $|b_i + c_j|$. Ví dụ: Giả sử dãy số bạn thứ nhất chọn là $1, -2$; còn dãy số mà bạn thứ hai chọn là $2, 3$. Khi đó các khả năng có thể của một lượt chơi là $(1, 2), (1, 3), (-2, 2), (-2, 3)$. Như vậy, giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể là $0$ tương ứng với giá của lượt chơi $(-2, -2)$.
Yêu cầu: Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể.
Dữ liệu vào:
Dữ liệu ra:
Ví dụ:
//Input
2
1 -2
2 3
//Output
0
define INF (long long)(1e13)
long long result = INF;
for (int i = 1; i<=n; i++)
for (int j = 1; j<=n; j++)
result = min(result, abs(b[i] + c[j]));
cin >> n;
for (int i = 1; i<=n; i++)
cin >> b[i];
for (int i = 1; i<=n; i++)
cin >> c[i];
sort(b + 1, b + n + 1);
//Tìm chỉ số lớn nhất của phần tử mảng b thoả mãn điều kiện <= - c[i]
int tknp1(int i)
{
int L = 1, R = n, mid, result = -1;
while (L <= R) {
mid = (L + R) >> 1;
if (b[mid] < -c[i]) {
result = mid;
L = mid + 1;
}
else
if (b[mid] == -c[i]) return mid;
else
R = mid - 1;
}
return result;
}
//Tìm chỉ số nhỏ nhất của phần tử mảng b thoả mãn điều kiện >= -c[i]
int tknp2(int i) {
int L = 1, R = n, mid, result = -1;
while (L <= R) {
mid = (L + R) >> 1;
if (b[mid] > -c[i]) {
result = mid;
R = mid - 1;
}
else
if (b[mid] == -c[i]) return mid;
else
L = mid + 1;
}
return result;
}
#include <bits/stdc++.h>
#define MAX int(1e5 + 6)
#define INF int(1e9 * 2 + 10)
using namespace std;
int n, c[MAX], b[MAX];
//tim phan tu cua b lon nhat tm dk <= - c[i]
int tknp1(int i)
{
int L = 1, R = n, mid, result = -1;
while (L <= R) {
mid = (L + R) >> 1;
if (b[mid] < -c[i]) {
result = mid;
L = mid + 1;
}
else
if (b[mid] == -c[i]) return mid;
else
R = mid - 1;
}
return result;
}
//tim phan tu cua b nho nhat tm dc >= -c[i]
int tknp2(int i) {
int L = 1, R = n, mid, result = -1;
while (L <= R) {
mid = (L + R) >> 1;
if (b[mid] > -c[i]) {
result = mid;
R = mid - 1;
}
else
if (b[mid] == -c[i]) return mid;
else
L = mid + 1;
}
return result;
}
int main()
{
freopen("SEQGAME.INP", "r", stdin);
freopen("SEQGAME.OUT", "w", stdout);
cin >> n;
for (int i = 1; i<=n; i++)
cin >> b[i];
for (int i = 1; i<=n; i++)
cin >> c[i];
int result = INF;
sort(b + 1, b + n + 1);
for (int i = 1; i<=n; i++)
{
if (tknp1(i) != -1)
result = min(result, abs(c[i] + b[tknp1(i)]));
if (tknp2(i) != -1)
result = min(result, abs(c[i] + b[tknp2(i)]));
}
cout << result;
return 0;
}