社区讨论

菜鸡求助

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

讨论操作

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

当前回复
27 条
当前快照
1 份
快照标识符
@mi7xp6dy
此快照首次捕获于
2025/11/21 05:19
4 个月前
此快照最后确认于
2025/11/21 06:50
4 个月前
查看原帖
WA 9-12 17-20\texttt{WA 9-12 17-20},只有 60pts\texttt{60pts} qaq
并不知道哪里错了qaq(窝tcl)
CPP
#include<bits/stdc++.h>
#define MAXN 500005
#define K 31
#define reg register
#define inl inline
#define int long long
using namespace std;
struct Node
{
	int pos,id,val;
	friend bool operator < (const Node &x,const Node &y)
	{
		return x.val<y.val;
	}
};
int n,m,cnt,t[MAXN<<2][2],siz[MAXN<<2],sum[MAXN<<2],ans;
priority_queue <Node> q;
template <typename T> inl void Read(reg T &x)
{
	x=0;
	reg int fu=1;
	reg char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') fu=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch-48);
	x*=fu;
}
inl void Modify(reg int x)
{
	reg int u=0;
	for(reg int i=K;i>=0;i--)
	{
		reg int ch=(x>>i)&1;
		if(!t[u][ch]) t[u][ch]=++cnt;
		siz[u]++;
		u=t[u][ch];
	}
	siz[u]++;
}
inl int Query(reg int x,reg int pos)
{
	reg int u=0,res=0;
	for(reg int i=K;i>=0;i--)
	{
		reg int ch=(x>>i)&1;
		if(!t[u][ch^1]) u=t[u][ch];
		else if(pos<=siz[t[u][ch^1]])
		{
			u=t[u][ch^1];
			res|=1ll<<i;
		}
		else
		{
			pos-=siz[t[u][ch^1]];
			u=t[u][ch];
		}
	}
	return res;
}
signed main()
{
	Read(n);
	Read(m);
	for(reg int i=1;i<=n;i++)
	{
		reg int x;
		Read(x);
		sum[i]=sum[i-1]^x;
	}
	for(reg int i=0;i<=n;i++) Modify(sum[i]);
	for(reg int i=0;i<=n;i++) q.push((Node){1,i,Query(sum[i],1)});
	ans=1;
	for(reg int i=1;i<=m*2;i++)
	{
		reg Node now=q.top();
		q.pop();
		ans+=now.val;
		if(now.pos<n) q.push((Node){now.pos+1,now.id,Query(sum[now.id],now.pos+1)});
	}
	printf("%lld\n",ans/2);
	return 0;
}

回复

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

正在加载回复...