异或粽子,可持久化Trie求调
查看原帖
异或粽子,可持久化Trie求调
131591
蒟蒻君HJT泽渡透香楼主2022/2/1 13:42

17~20WA,前面都能过,不知道为什么。。

#include <bits/stdc++.h>
using namespace std;
const long long Maxn=500005;
long long S[Maxn],n,k,root[Maxn],tot,t[Maxn][35],sum;
struct node{
	long long siz,son[2]; 
}trie[40*Maxn];
struct Fuck{
	long long r,val,K;
};
void Update(long long ii){
	long long now;
	if(ii==0){
		root[0]=++tot;long long now=tot;
		for(tot=2;tot<=33;++tot){
			trie[now].son[0]=tot;
			++trie[now].siz;
			now=trie[now].son[0];
		}
		--tot;
		++trie[now].siz;
		return ;
	}
	root[ii]=++tot;
	now=root[ii];long long renow=root[ii-1];
	for(long long i=1;i<=32;++i){
		trie[now]=trie[renow];++trie[now].siz;
		trie[now].son[t[ii][i]]=++tot;
		now=trie[now].son[t[ii][i]];
		renow=trie[renow].son[t[ii][i]];
	}
	++trie[now].siz;
	return ;
}
struct cmp1{
	bool operator()(Fuck a,Fuck b){
		return a.val<b.val;
	}
};
long long Query(long long R,long long K){
	long long now=root[R-1],r=1,ans=0;
	while(r<=32){
		ans*=2;
		if(trie[trie[now].son[t[R][r]^1]].siz>=K)
			now=trie[now].son[t[R][r]^1],ans+=t[R][r]^1;
		else K-=trie[trie[now].son[t[R][r]^1]].siz,
			now=trie[now].son[t[R][r]],ans+=t[R][r];
		++r; 
	}
	return ans;
}
int main(){
	cin>>n>>k;
	for(long long i=1;i<=n;++i) scanf("%lld",&S[i]),S[i]^=S[i-1];
	tot=0;Update(0);
	for(long long i=1;i<=n;++i){
		long long s=S[i];
		for(long long j=1;j<=32;++j){
			t[i][33-j]=s&1;
			s/=2;
		}
	}
	for(long long i=1;i<=n;++i) Update(i);
	priority_queue<Fuck,vector<Fuck>,cmp1>q;
	long long ans=0;
	for(long long i=1;i<=n;++i){
		Fuck u;u.K=1;
		u.r=i;u.val=S[i]^Query(i,1);q.push(u);
	}
	for(long long i=1;i<=k;++i){
		Fuck u;u=q.top();q.pop();ans+=u.val;
		if(u.K<u.r) ++u.K,u.val=S[u.r]^Query(u.r,u.K),q.push(u);
	}
	cout<<ans<<endl;
	return 0;
}
2022/2/1 13:42
加载中...