結果
問題 | No.2977 Kth Xor Pair |
ユーザー |
|
提出日時 | 2024-12-01 02:22:47 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,838 ms / 3,000 ms |
コード長 | 4,716 bytes |
コンパイル時間 | 6,377 ms |
コンパイル使用メモリ | 260,092 KB |
最終ジャッジ日時 | 2025-02-26 09:52:50 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 34 |
ソースコード
#include<bits/stdc++.h>using namespace std;using ll = long long;bool deb = 1;/*base:桁数insert(num): numを挿入. O(log(N))erase(num): numがあれば一つ削除 O(log(N))search(num): numがあるか判定 O(log(N))small_num(num,x) d XOR num <x となる dの個数 O(log(N))XOR_min(x): min(d XOR x) を求めるToDo:insert_cnt(num,x): numをcnt個挿入erase_all(num): numがあれば全て削除XOR_max(x): min(d XOR x) を求めるAll_xor(x): 全ての要素をXORする.全てO(logN)でできるはず.最後のは遅延評価的なのが必要でちょっと体力がいる*/struct Binary_Trie {ll base = 36;//桁数struct Node {array<int,2> next;ll c;ll common;Node(ll c_) : c(c_), common(0) {next[0]=next[1]=-1;}};vector<Node> nodes;ll root = 0;Binary_Trie() {nodes.push_back(Node(root));}void insert(const ll& num) {ll node_id = 0;for (ll b = base; b >= 0; b--) {ll nt = 0;nt = (num & (1ll << b) ? 1 : 0);if (nodes[node_id].next[nt] == -1) {nodes.push_back(Node(nt));nodes[node_id].next[nt] = nodes.size() - 1;}nodes[node_id].common++;node_id = nodes[node_id].next[nt];}nodes[node_id].common++;}bool search(const ll& num) {ll node_id = 0;bool EX = 1;for (ll b = base; b >= 0; b--) {ll nt = 0;nt = (num & (1ll << b) ? 1 : 0);if (nodes[node_id].next[nt] == -1||nodes[nodes[node_id].next[nt]].common==0) {EX = 0;break;}node_id = nodes[node_id].next[nt];}return EX;}void erase(const ll& num) {if (!search(num))return;ll node_id = 0;for (ll b = base; b >= 0; b--) {ll nt = 0;nt = (num & (1ll << b) ? 1 : 0);nodes[node_id].common--;node_id = nodes[node_id].next[nt];}nodes[node_id].common--;}ll small_num(const ll& p, const ll& x) {//d XOR p<x なるdの個数ll res = 0;ll node_id = 0;for (ll b = base; b >= 0; b--) {ll nx = 0, np = 0;nx = (x & (1ll << b) ? 1 : 0);np = (p & (1ll << b) ? 1 : 0);if (nx == 1) {if (nodes[node_id].next[np] != -1) {res += nodes[nodes[node_id].next[np]].common;}if (nodes[node_id].next[1 - np] == -1) {break;}else {node_id = nodes[node_id].next[1 - np];continue;}}else {if (nodes[node_id].next[np] == -1) {break;}else {node_id = nodes[node_id].next[np];continue;}}}return res;}ll min_XOR(ll x){ll res=0;ll node_id = 0;for (ll b = base; b >= 0; b--) {ll nx = 0;nx = (x & (1ll << b) ? 1 : 0);if (nodes[node_id].next[nx] != -1&&nodes[nodes[node_id].next[nx]].common>0) {node_id=nodes[node_id].next[nx];}else {res+=(1ll<<b);node_id = nodes[node_id].next[1 - nx];}}return res;}ll K_thsmall(ll K){//K番目に小さい値を返す.(0index)if(nodes[0].common<=K)return -1e18;ll node_id=0;ll res=0;for (ll b = base; b >= 0; b--) {if(nodes[node_id].next[0]!=-1&&nodes[nodes[node_id].next[0]].common>K){node_id=nodes[node_id].next[0];}else{res+=(1ll<<b);if(nodes[node_id].next[0]!=-1){K-=nodes[nodes[node_id].next[0]].common;}node_id=nodes[node_id].next[1];}}return res;}};int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);ll N=2e5;ll K=(N*(N-1))/4;cin>>N>>K;vector<ll> A(N);Binary_Trie B;for(int i=0;i<N;i++){cin>>A[i];// A[i]=rand()%ll(1e9);B.insert(A[i]);}ll L=-1,R=4e9;while(R-L>1){ll M=(R+L)/2;ll cnt=0;if(M!=0)for(int i=0;i<N;i++){cnt+=B.small_num(A[i],M)-1;}(cnt/2<K?L:R)=M;}cout<<L<<endl;}