01trie求 异或 k 小值板子求调,问题大概确定
查看原帖
01trie求 异或 k 小值板子求调,问题大概确定
368124
Aurora_Borealis_楼主2024/1/27 10:21

目前已知query输出结果不对。

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define int long long
#define debug cout<<"DEBUG"<<endl;
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define imp map<int,int>
using namespace std;
const int N=1e5+5; 
int n,k,a[N],son[N*50][2],siz[N*50],cnt;
void insert(int x){
	int p=0;
	for(int i=30;i>=0;i--){
		printf("id:%lld\n",p);
		if(!son[p][(x>>i)&1]) son[p][(x>>i)&1]=++cnt;
		siz[p]++;
		p=son[p][(x>>i)&1];
	}
	siz[p]++;
}
struct pq{
	int val,id,res;
	bool operator <(const pq &k) const {
		return val<k.val;
	}
};
int query(int x,int k){
	int p=0,ans=0;
	for(int i=30;i>=0;i--){
		//printf("id:%lld\n",p);
		int now=(x>>i)&1;
		if(k<=siz[son[p][now]]&&son[p][now]) p=son[p][now];
		else{
			k-=siz[son[p][now]];
			p=son[p][now^1];
			ans+=(1ll<<i);
		}
	}
	return ans;
}
priority_queue<pq>q;
signed main(){
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		insert(a[i]);
	}
	k*=2;
	for(int i=1;i<=n;i++){
		q.push((pq){a[i]^query(a[i],2),i,2});
		printf("%lld ",a[i]^query(a[i],2));
	}
	printf("\n");
	for(int i=1;i<=k;i++){
		pq ans=q.top();
		q.pop();
		//if(i&1){
			printf("%lld ",ans.val);
		//}
		if(ans.res==n) continue;
		q.push((pq){a[ans.id]^query(a[ans.id],ans.res+1),ans.id,ans.res+1});
	}
	return 0;
}

2024/1/27 10:21
加载中...