原题传送门

看见一段的异或和不难想到要做异或前缀和\(s\)

我们便将问题转化成:给定\(n\)个数,求异或值最靠前的\(k\)对之和

我们珂以建一个可持久化01trie,这样我们就珂以求出每个值\(s[a]\)与之前所有的值异或值最大的值\(b\)是多少,把这些所有\((b,a)\)塞进一个堆中

每次从堆顶取元素,设这个元素为\((b,a)\),要将\(b\)加入答案,并且在版本\(a\)的01trie中减去\(s[a]\)^\(b\),再取出\(s[a]\)与01trie中的数异或最大值(原来的次大值)\(c\),把\((c,a)\)塞进这个堆中

重复做k次即可得到答案

#include <bits/stdc++.h>
#define N 500005
#define uint unsigned int
#define ll long long
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline uint read()
{
register uint x=0;register char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x;
}
inline void write(register ll x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
int n,k;
ll ans=0;
uint a[N],b[N];
priority_queue< pair<ll,ll> > q;
struct node{
int sum,ch[2];
}tr[N*60];
int root[N],tot;
inline void update(register int &x,register int pre,register uint val,register int dep)
{
x=++tot;
tr[x]=tr[pre];
++tr[x].sum;
if(dep==-1)
return;
if((1ll<<dep)&val)
update(tr[x].ch[1],tr[pre].ch[1],val,dep-1);
else
update(tr[x].ch[0],tr[pre].ch[0],val,dep-1);
}
inline uint query(register int x,register uint val,register int dep)
{
if(dep==-1)
return 0;
if(val&(1ll<<dep))
{
if(tr[tr[x].ch[0]].sum)
return query(tr[x].ch[0],val,dep-1);
else
return query(tr[x].ch[1],val,dep-1)+((uint)1<<dep);
}
else
{
if(tr[tr[x].ch[1]].sum)
return query(tr[x].ch[1],val,dep-1)+((uint)1<<dep);
else
return query(tr[x].ch[0],val,dep-1);
}
}
inline void modify(register int &x,register int pre,register uint val,register int dep)
{
x=++tot;
tr[x]=tr[pre];
--tr[x].sum;
if(dep==-1)
return;
if((1ll<<dep)&val)
modify(tr[x].ch[1],tr[pre].ch[1],val,dep-1);
else
modify(tr[x].ch[0],tr[pre].ch[0],val,dep-1);
}
int main()
{
n=read(),k=read();
b[0]=0;
for(register int i=1;i<=n;++i)
{
a[i]=read();
b[i]=b[i-1]^a[i];
}
for(register int i=1;i<=n;++i)
update(root[i],root[i-1],b[i-1],31);
for(register int i=1;i<=n;++i)
{
uint tmp=query(root[i],b[i],31);
q.push(make_pair(tmp^b[i],i));
}
while(k--&&!q.empty())
{
pair<ll,ll> tmp=q.top();
q.pop();
ans+=tmp.first;
int pos=tmp.second;
modify(root[pos],root[pos],tmp.first^b[pos],31);
if(!tr[root[pos]].sum)
continue;
uint tmpp=query(root[pos],b[pos],31);
q.push(make_pair(b[pos]^tmpp,pos));
}
write(ans);
return 0;
}

【题解】Luogu P5283 [十二省联考2019]异或粽子的更多相关文章

  1. Luogu P5283 [十二省联考2019]异或粽子

    感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...

  2. 【简】题解 P5283 [十二省联考2019]异或粽子

    传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...

  3. P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树

    $ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...

  4. P5283 [十二省联考2019]异或粽子

    考场上想到了没打完,细节思路还是不是很优,我原先的想法是每一次找完后标记那个点,下次再继续找(并不是这个意思,说不清楚)但实际上和平衡树一样加个大小就很好写了 #include<bits/std ...

  5. [十二省联考2019]异或粽子 01trie

    [十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...

  6. 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)

    [BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...

  7. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  8. Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】

    联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...

  9. 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解

    https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...

随机推荐

  1. SSH登录慢解方案 - 关闭UseDNS加速

    每次登录SSH时总是要停顿等待一会儿才能连接上,,这是因为OpenSSH服务器有一个DNS查找选项UseDNS默认情况下是打开的. UseDNS 选项打开状态下,当通过终端登录SSH服务器时,服务器端 ...

  2. salt-master命令详解

    **salt-master命令** 命令行官网学习网站:http://docs.saltstack.cn/ref/cli/index.html salt salt-call salt-cp salt- ...

  3. An intriguing failing of convolutional neural networks and the CoordConv solution

    An intriguing failing of convolutional neural networks and the CoordConv solution NeurIPS 2018 2019- ...

  4. TF 保存模型为 .pb格式

    将网络模型,图加权值,保存为.pb文件  write.py # -*- coding: utf-8 -*- from __future__ import absolute_import, unicod ...

  5. Python80个练手项目列表

    原文地址:https://www.shiyanlou.com/questions/102676/?utm_source=baidu&utm_medium=cpc&utm_campaig ...

  6. A Full Hardware Guide to Deep Learning深度学习电脑配置

     https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博 ...

  7. 【C++】C++中的lambda表达式和函数对象

    目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder ...

  8. MSSQL Server 及 MSSQL Express版本 自动备份

    一.SQL Server Management Studio(SMSS) 维护计划 [参考]SQL SERVER如何定期自动备份数据库 二.Windows 级 任务计划程序( MSSQL Expres ...

  9. LeetCode 108. Convert Sorted Array to Binary Search Tree (将有序数组转换成BST)

    108. Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascendin ...

  10. php mysql 根据经纬度计算距离和排序

    #.两点距离(1.4142135623730951) ,),point(,)); ORDER BY distance; mysql 5.6 添加 #.两点球面距离(.0357231545m) ,),p ...