結果
| 問題 |
No.2977 Kth Xor Pair
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-12-01 03:43:53 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,881 bytes |
| コンパイル時間 | 2,414 ms |
| コンパイル使用メモリ | 207,516 KB |
| 最終ジャッジ日時 | 2025-02-26 09:54:39 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | WA * 34 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
ll k, tot = 0;
cin >> n >> k;
vector<pair<int,int>> C;
vector<vector<int>> A, B;
C.reserve(n);
A.reserve(n);
B.reserve(n);
tot = (ll)(n) * (n - 1) / 2;
vector<int> a(n);
for(auto &&v : a) cin >> v;
auto f = [&](vector<int> &a, vector<int> &b, int lg){
int cnt0 = 0, cnt1 = 0;
for(auto &&v : a) cnt0 += (v >> lg & 1);
for(auto &&v : a) cnt1 += (v >> lg & 1);
return make_pair(cnt0, cnt1);
};
int ans = 0;
for(int i = __lg(*max_element(a.begin(), a.end())), prv = 0; i >= 0; i--){
if(A.empty()){
int cnt = 0;
for(auto &&v : a){
cnt += (v >> i & 1);
}
tot -= cnt * (ll)(n - cnt);
if(k >= tot){
k -= tot;
ans |= 1 << i;
A.emplace_back(vector<int>({}));
B.emplace_back(vector<int>({}));
A[0].reserve(cnt);
B[0].reserve(n - cnt);
C.emplace_back(0, 0);
for(auto &&v : a){
if(v >> i & 1) A.back().emplace_back(v);
else B.back().emplace_back(v);
}
}
continue;
}
ll sv = 0;
for(int j = prv; j < A.size(); j++){
C[j] = f(A[j], B[j], i);
auto [a1, b1] = C[j];
ll a0 = A[j].size() - a1, b0 = B[j].size() - b1;
sv += a1 * b0 + b1 * a0;
}
tot -= sv;
if(k >= tot){
k -= tot;
ans |= 1 << i;
int sz = A.size();
for(int j = prv; j < sz; j++){
auto [a1, b1] = C[j];
int a0 = A[j].size() - a1, b0 = B[j].size() - b1;
if(a0 >= 1 && b1 >= 1){
A.emplace_back(vector<int>({}));
B.emplace_back(vector<int>({}));
C.emplace_back(0, 0);
A.back().reserve(a0);
B.back().reserve(b1);
for(auto &&v : A[j]) if(~v >> i & 1) A.back().emplace_back(v);
for(auto &&v : B[j]) if(v >> i & 1) B.back().emplace_back(v);
}
if(a1 >= 1 && b0 >= 1){
A.emplace_back(vector<int>({}));
B.emplace_back(vector<int>({}));
C.emplace_back(0, 0);
A.back().reserve(a1);
B.back().reserve(b0);
for(auto &&v : A[j]) if(v >> i & 1) A.back().emplace_back(v);
for(auto &&v : B[j]) if(~v >> i & 1) B.back().emplace_back(v);
}
}
prv = sz;
}
}
cout << ans << '\n';
}