社区讨论

我们任然不知道对拍的真实作用

P5283[十二省联考 2019] 异或粽子参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lwojyh3s
此快照首次捕获于
2024/05/27 13:53
2 年前
此快照最后确认于
2024/05/27 18:11
2 年前
查看原帖
先和我的60分暴力程序对拍,拍了一个半小时(500000多次)没有拍出来,觉得可能是数据小了,又和第一篇题解对拍,还是没有拍出来,求大佬帮助。
思路同第一篇题解
CPP
#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;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...