社区讨论
菜鸡求助
P5283[十二省联考 2019] 异或粽子参与者 17已保存回复 27
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 27 条
- 当前快照
- 1 份
- 快照标识符
- @mi7xp6dy
- 此快照首次捕获于
- 2025/11/21 05:19 4 个月前
- 此快照最后确认于
- 2025/11/21 06:50 4 个月前
,只有 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 条回复,欢迎继续交流。
正在加载回复...