萌新 AC100pts 求问
查看原帖
萌新 AC100pts 求问
398190
lanretE楼主2022/6/14 14:58

这个是 AC 代码

#include<iostream>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
const int N=5e5+10;
int n,k;
ll a[N],s[N];
int trie[32*N][2],cnt[32*N],tot;

struct node{
	ll w;
	int x,y; 
	bool operator < (const node &a)const {
		return w<a.w;
	}
}d[N];
priority_queue<node>q;
void insert(ll v){
	int u=0;
	for(int i=31;i>=0;--i){
		int z=(v>>i)&1;
		if(!trie[u][z]) trie[u][z]=++tot;
		u=trie[u][z];
		++cnt[u];
	}
} 
ll find(ll v,int t){
	ll s=0; int u=0;
	for(int i=31;i>=0;--i){
		int z=(v>>i)&1;
		if(cnt[trie[u][z^1]]>=t){
			u=trie[u][z^1];
			s|=(1ll<<i);
		}
		else{
			t-=cnt[trie[u][z^1]];
			u=trie[u][z];
		}
	}
	return s;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
		a[i]^=a[i-1];//前缀和 
	}
	for(int i=0;i<=n;++i) insert(a[i]);
	k<<=1;
	for(int i=0;i<=n;++i){
		d[i].w=find(a[i],1);
		d[i].x=i; d[i].y=1;
		q.push(d[i]);
	}
	ll ans=0;
	for(int i=1;i<=k;++i){
		node h=q.top(); q.pop();
		ans+=h.w;
		d[h.x].y++;
		d[h.x].w=find(a[h.x],d[h.x].y);
		q.push(d[h.x]);
	}
	cout<<ans/2<<endl;
	return 0;
}

但是如果把 trie 的 insert 改成这样,就死循环,请问是为什么。

void insert(ll v){
	int u=0;
	for(int i=(1<<31);i;i>>=1){
		int z=bool(v&i);
		if(!trie[u][z]) trie[u][z]=++tot;
		u=trie[u][z];
		++cnt[u];
	}
}
2022/6/14 14:58
加载中...