题目

【题目描述】

小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。

小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$。第 $i$ 种馅儿具有一个非负整数的属性值 $a_i$。每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子。小粽准备用这些馅儿来做出 $k$ 个粽子。

小粽的做法是:选两个整数数 $l,r$,满足 $1\le l\le r\le n$,将编号在 $[l,r]$ 范围内的所有馅儿混合做成一个粽子,所得的粽子的美味度为这些粽子的属性值的**异或**和。(异或就是我们常说的 $\mathrm{xor}$ 运算,即 C/C++ 中的 `^` 运算符或 Pascal 中的 `xor` 运算符)

小粽想品尝不同口味的粽子,因此它不希望用同样的馅儿的集合做出一个以上的粽子。

小粽希望她做出的所有粽子的美味度之和最大。请你帮她求出这个值吧!

【输入格式】

从标准输入读入数据。

第一行两个正整数 $n,k$,表示馅儿的数量,以及小粽打算做出的粽子的数量。

接下来一行为 $n$ 个非负整数,第 $i$ 个数为 $a_i$,表示第 $i$ 个粽子的属性值。

【输出格式】

输出到标准输出。

输出一行一个整数,表示小粽可以做出的粽子的美味度之和的最大值。

【样例输入】

3 2
1 2 3

【样例输出】

6

【数据范围与提示】

|测试点|$n$|$k$|
|:-:|:-:|:-:|
|$1\sim 8$|$\le 10^{3}$|$\le 10^{3}$|
|$9\sim 12$|$\le 5 \times 10^{5}$|$\le 10^{3}$|
|$13\sim 16$|$\le 10^{3}$|$\le 2 \times 10^{5}$|
|$17\sim 20$|$\le 5 \times 10^{5}$|$\le 2 \times 10^{5}$|

对于所有的输入数据都满足:$1\le n \le 5 \times 10^{5},1\le k\le \min\left\{\frac{n(n-1)}{2},2 \times 10^{5}\right\},0\le a_i \le 4,294,967,295$。

题解

首先考虑在前缀异或和上暴力,$ n^2 $ 找出所有的值,放进堆里,取前 $ k $ 大的即可,效率 $ O(n^2+\log k) $,可以过 $ 60 \% $

显然把 $ x $ 所有能匹配的都找出来是不可能的,于是考虑在 tire 树上贪心

建 $ n $ 棵可持久化 tire 树,然后在 $ [0,i-1] $ 上贪心即可

考虑如何去重

于是我在测试时想到将 $ x $ 贪心对应的最大值的点 $ p $ 挖掉,然后变成两个区间 $ [l,p-1] $ 和 $ [p+1,r] $,找对应点时建一个链表即可(类似《超级钢琴》)

然而这样的常数太大,于是 map TLE,但还有 unorder map 嘛,跑得飞快

其实可以在 tire 树上二分第 $ k $ 大的值,放入堆时记录下是第 $ k $ 大的即可,为什么我没有想到

代码

显然二分是不可能去写的

 #include<bits/stdc++.h>
#define LL long long
#define U unsigned
#include<tr1/unordered_map>
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
LL R(){
LL x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=5e5+;
int n,m,rot[N],tr[N*][],cnt,s[N*][],nex[N];
LL a[N],sum[N],ans;
struct node{
LL w,v;int l,r;
bool friend operator <(node a,node b){return a.w<b.w;}
};priority_queue<node> q;
tr1::unordered_map<LL,int>mp;
void insert(int &k,int o,LL len,LL v){
if(!~len)return;
k=++cnt;
int f=(v>>len)&;
tr[k][f^]=tr[o][f^],s[k][f^]=s[o][f^],s[k][f]=s[o][f]+;
insert(tr[k][f],tr[o][f],len-,v);
}
LL query(int k,int o,LL len,LL v){
if(!~len)return ;
int f=(v>>len)&;
if(s[k][f^]-s[o][f^])
return (1ll<<len)+query(tr[k][f^],tr[o][f^],len-,v);
else return query(tr[k][f],tr[o][f],len-,v);
}
int find(LL x,int l,int r){
for(int k=mp[x];k;k=nex[k])
if(k<=r&&k>=l)return k;
return ;}
int main(){
n=R(),m=R();
insert(rot[],,,);
for(int i=;i<=n;i++){
a[i]=R(),sum[i]=sum[i-]^a[i];
nex[i]=mp[sum[i]],mp[sum[i]]=i;
insert(rot[i],rot[i-],,sum[i]);
}
for(int i=;i<=n;i++){
LL w=query(rot[i-],,,sum[i]);
q.push((node){w,sum[i],,i-});
}
while(m--){
node now=q.top();q.pop();ans+=now.w;
int id=find(now.w^now.v,now.l,now.r);
if(id->=now.l)q.push((node){query(rot[id-],rot[now.l-],,now.v),now.v,now.l,id-});
if(now.r>=id+)q.push((node){query(rot[now.r],rot[id+-],,now.v),now.v,id+,now.r});
}
cout<<ans<<endl;
return ;
}

「十二省联考 2019」异或粽子——tire树+堆的更多相关文章

  1. LOJ3048 「十二省联考 2019」异或粽子

    题意 题目描述 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具 ...

  2. LOJ#3048. 「十二省联考 2019」异或粽子 Trie

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...

  3. 「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题 ...

  4. LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)

    题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...

  5. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  6. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  7. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  8. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  9. 「十二省联考 2019」字符串问题——SAM+DAG

    题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...

随机推荐

  1. Day3(1)linux文件系统及文件类型

    Linux的文件系统 根文件系统(rootfs) root filesystem LSB,FHS:(FileSystem Heirache Standard) /etc,/usr,/var,/root ...

  2. 机器学习:评价分类结果(F1 Score)

    一.基础 疑问1:具体使用算法时,怎么通过精准率和召回率判断算法优劣? 根据具体使用场景而定: 例1:股票预测,未来该股票是升还是降?业务要求更精准的找到能够上升的股票:此情况下,模型精准率越高越优. ...

  3. 查看,修改ceph节点的ceph配置命令

    标签(空格分隔): ceph,ceph运维,ceph配置 查看ceph配置 1. 查看ceph默认配置: # ceph --show-config 2. 查看 type.num 的ceph默认配置: ...

  4. 侯捷STL学习(四)--OOP-GP/操作符重载-泛化特化

    C++标准库第二讲 体系结构与内核分析 第1-7节为第一讲 读源代码前的准备 第八节:源代码分布 C++基本语法 模板的使用 数据结构和算法 本课程主要使用:Gnu C 2.9.1与Gun C 4.9 ...

  5. .Net 一直在改变

    Microsoft 微软又进一步了,每天都有惊喜. MSDN,是微软官网开发者技术支持网络,今天给我一个小惊喜,不多说直接上图.分享给大家 右键新打开Tab选项,就能看到官方的源码实现.为我们学习提供 ...

  6. 手机定位室内gps没信号

    手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.

  7. 2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效

    如果表结构只对应一个字段,可以 select col1 bulk collect into 变量,不用游标循环,简洁高效 create or replace function get_airway_s ...

  8. Mybatis 内置 Java 类型别名与 typeHandlers

    aliases There are many built-in type aliases for common Java types. They are all case insensitive, n ...

  9. windows系统中启动应用需要的端口被别的程序占用

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  10. NLTK与NLP原理及基础

    参考https://blog.csdn.net/zxm1306192988/article/details/78896319 以NLTK为基础配合讲解自然语言处理的原理  http://www.nlt ...