我们任然不知道对拍的真实作用
查看原帖
我们任然不知道对拍的真实作用
938212
OMG_NOIP楼主2024/5/27 13:52

先和我的60分暴力程序对拍,拍了一个半小时(500000多次)没有拍出来,觉得可能是数据小了,又和第一篇题解对拍,还是没有拍出来,求大佬帮助。

思路同第一篇题解

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,pre[500005],siz[10000005];
ll tri[10000005][2],pot,tot[500005];
inline void insert(ll x){
	ll p=0;
	for(ll i=32;i>=0;i--){
		ll to=x>>i&1;
		if(!tri[p][to])tri[p][to]=++pot;
		p=tri[p][to];siz[p]++;
	}
}
inline ll query(ll x,ll k){
	ll p=0,res=0;
	for(ll i=32;i>=0;i--){
		ll to=x>>i&1;
		if(!tri[p][to^1])p=tri[p][to];
		else if(k<=siz[tri[p][to^1]]){p=tri[p][to^1];res+=1<<i;}
		else{k-=siz[tri[p][to^1]];p=tri[p][to];}
	}
	return res;
}
priority_queue<pair<ll,ll>>que;
signed main(){
//	freopen("code.in","r",stdin);
//	freopen("code.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n>>k;k<<=1;
	insert(0);
	for(ll i=1;i<=n;i++){
		cin>>pre[i];
		pre[i]^=pre[i-1];
		insert(pre[i]);
	}
	for(ll i=0;i<=n;i++){
		que.push({query(pre[i],++tot[i]),i});
	}
	ll ans=0;
	while(k--){
		ans+=que.top().first;
		ll p=que.top().second;
		que.pop();
		que.push({query(pre[p],++tot[p]),p});
	}
	cout<<ans/2;
	return 0;
}
2024/5/27 13:52
加载中...