結果

問題 No.3073 Fraction Median
ユーザー 👑 loop0919
提出日時 2025-03-21 23:16:55
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 2,561 bytes
コンパイル時間 4,760 ms
コンパイル使用メモリ 96,464 KB
実行使用メモリ 22,228 KB
最終ジャッジ日時 2025-03-21 23:17:07
合計ジャッジ時間 10,964 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 4 TLE * 1 -- * 13
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// gcd
long long gcd(long long a, long long b) {
while (b != 0) {
long long temp = a % b;
a = b;
b = temp;
}
return a;
}
//
int N;
vector<long long> A;
// __int128 使
bool comp(long long x_c, long long x_d, long long y_c, long long y_d) {
__int128 lhs = (__int128)x_c * y_d;
__int128 rhs = (__int128)y_c * x_d;
return lhs <= rhs;
}
// check : val (bool, (max_c, max_d))
pair<bool, pair<long long, long long>> check(long long val) {
long long max_c = 0, max_d = 1;
long long cnt = 0;
for (int i = 0; i < N; i++) {
int ok = 0, ng = N;
// : ok
while (ng - ok > 1) {
int mid = (ok + ng) / 2;
// Python comp((A[mid-1], A[i]), (val, 2 * 10**18))
if (comp(A[mid - 1], A[i], val, 2000000000000000000LL)) {
ok = mid;
} else {
ng = mid;
}
}
cnt += ok;
// (max_c, max_d)
if (ok > 0 && comp(max_c, max_d, A[ok - 1], A[i])) {
max_c = A[ok - 1];
max_d = A[i];
}
}
// N*(N-1)/2 true false
if (cnt < (long long)N * (N - 1) / 2) {
return {true, {max_c, max_d}};
} else {
return {false, {max_c, max_d}};
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
//
cin >> N;
A.resize(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
//
sort(A.begin(), A.end());
// main : [0, 2*10^18+1) val
long long ok_val = 0, ng_val = 2000000000000000000LL + 1;
while (ng_val - ok_val > 1) {
long long mid = (ok_val + ng_val) / 2;
if (check(mid).first) {
ok_val = mid;
} else {
ng_val = mid;
}
}
//
auto ans = check(ng_val).second;
long long g = gcd(ans.first, ans.second);
cout << (ans.first / g) << " " << (ans.second / g) << "\n";
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0