結果
| 問題 |
No.2977 Kth Xor Pair
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-12-01 04:35:15 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,807 bytes |
| コンパイル時間 | 2,406 ms |
| コンパイル使用メモリ | 210,264 KB |
| 最終ジャッジ日時 | 2025-02-26 09:56:00 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | WA * 25 RE * 9 |
ソースコード
#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, D(1);
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;
D[0] = a;
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()){
for(auto &&vec : D){
int cnt = 0;
for(auto &&v : vec){
cnt += (v >> i & 1);
}
tot -= cnt * (ll)(vec.size() - cnt);
}
if(k >= tot){
k -= tot;
ans |= 1 << i;
for(auto &&vec : D){
A.emplace_back(vector<int>({}));
B.emplace_back(vector<int>({}));
C.emplace_back(0, 0);
for(auto &&v : vec){
if(v >> i & 1) A.back().emplace_back(v);
else B.back().emplace_back(v);
}
}
}else{
int sz = D.size();
for(int j = 0; j < sz; j++){
auto &&vec = D[j];
int cnt = 0;
for(auto &&v : vec){
if(v >> i & 1) cnt++;
}
if(cnt != 0 && cnt != vec.size()){
D.emplace_back(vector<int>());
D.back().reserve(cnt);
for(int k = vec.size() - 1; k >= 0; k--){
if(vec[k] >> i & 1){
D.back().emplace_back(vec[k]);
swap(vec[k], vec.back());
vec.pop_back();
}
}
}
}
}
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';
}