結果
| 問題 |
No.1597 Matrix Sort
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-07-22 17:30:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 410 ms / 1,500 ms |
| コード長 | 1,140 bytes |
| コンパイル時間 | 1,746 ms |
| コンパイル使用メモリ | 174,444 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-17 14:58:58 |
| 合計ジャッジ時間 | 10,130 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll solve() {
ll N, K, P;
cin >> N >> K >> P;
vector<ll> A(N), B(N);
for ( int i = 0; i < N; i++ ) cin >> A[i];
for ( int i = 0; i < N; i++ ) cin >> B[i];
sort(A.begin(), A.end());
sort(B.begin(), B.end());
auto get_le = [&](ll x) -> ll {
ll s = 0;
for ( int i = 0; i < N; i++ ) {
s += upper_bound(B.begin(), B.end(), x-A[i]) - lower_bound(B.begin(), B.end(), -A[i]);
s += upper_bound(B.begin(), B.end(), P+x-A[i]) - lower_bound(B.begin(), B.end(), P-A[i]);
}
return s;
};
// 単調非減少関数f(x), x:定義域[l,r), 戻り値は [l,r]
// y <= f(x) となる最小のx
auto lower_bound_f = [](ll l, ll r, ll y, auto f) -> ll {
l--;
while ( r-l > 1 ) {
ll m = l + (r-l)/2;
ll fx = f(m);
if ( y <= fx ) r = m;
else l = m;
}
return r;
};
ll ans = lower_bound_f(0,P,K,get_le);
return ans;
}
int main() {
auto ans = solve();
cout << ans << "\n";
return 0;
}