前置芝士:可持久化Trie &

类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\(pos\)

我们维护一个小根堆(堆顶最大),权值为st-pos的异或和,每一次找出最大的并删掉

所谓删,就是把一个区间从pos处分裂

即:\((st, l, r)->(st, l, pos - 1) (st, pos + 1, r)\)

这样重新维护pos值即可

维护pos值时,我们需要维护区间内与x的异或值最大,不难想到可持久化\(Trie\),于是只需要把超级钢琴中的\(RMQ\)变成可持久化\(Trie\)即可

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\n",__LINE__)
#define file(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define ll long long
il ll read() {
re ll x = 0, f = 1; re char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define maxn 500005
int n, m;
ll sum[maxn], ans;
namespace Trie {
struct PAX {
int id, s, ch[2];
}e[maxn * 50];
int cnt, rt[maxn];
il void insert(int&k, int kk, int bit, int id, ll val) {
k = ++ cnt;
e[k] = e[kk], ++ e[k].s;
if(bit == -1) return(void)(e[k].id = id);
int c = (val >> bit) & 1;
insert(e[k].ch[c], e[kk].ch[c], bit - 1, id, val);
}
il int query(int l, int r, int bit, ll val) {
if(bit == -1) return e[r].id;
int c = (val >> bit) & 1;
if(e[e[r].ch[c ^ 1]].s > e[e[l].ch[c ^ 1]].s)
return query(e[l].ch[c ^ 1], e[r].ch[c ^ 1], bit - 1, val);
return query(e[l].ch[c], e[r].ch[c], bit - 1, val);
}
}
using namespace Trie;
struct node {
int st, l, r, pos;
il bool operator < (const node a) const {
return (sum[pos] ^ sum[st - 1]) < (sum[a.pos] ^ sum[a.st - 1]);
}
node(int St, int L, int R) {
st = St, l = L, r = R, pos = query(rt[l - 1], rt[r], 32, sum[st - 1]);
}
};
priority_queue<node>q;
signed main() {
file(a);
n = read(), m = read();
rep(i, 1, n) sum[i] = sum[i - 1] ^ read();
rep(i, 1, n) insert(rt[i], rt[i - 1], 32, i, sum[i]);
rep(i, 1, n) q.push(node(i, i, n));
while(m --) {
node t = q.top(); q.pop();
ans += sum[t.pos] ^ sum[t.st - 1];
if(t.l < t.pos) q.push(node(t.st, t.l, t.pos - 1));
if(t.pos < t.r) q.push(node(t.st, t.pos + 1, t.r));
}
printf("%lld", ans);
return 0;
}

[十二省联考2019]异或粽子(堆+可持久化Trie)的更多相关文章

  1. 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)

    点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...

  2. [十二省联考2019]异或粽子 (可持久化01tire 堆)

    /* 查询异或最大值的方法是前缀和一下, 在01trie上二分 那么我们可以对于n个位置每个地方先求出最大的数, 然后把n个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插 ...

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

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

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

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

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

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

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

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

  7. Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)

    做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...

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

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

  9. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)

    LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...

随机推荐

  1. QuickBI助你成为分析师——计算字段功能

    摘要: 在用户创建报表时,通过现有字段数据不能直接满足展示需求,需要进行一定建模操作.目前产品支持在数据集编辑界面进行初步建模,下面主要介绍新建字段功能,以达到展示需求. 在用户创建报表时,有时通过现 ...

  2. 《全栈营销之如何制作个人博客》之二:php环境安装及个人博客后台搭建 让你的博客跑起来

    上一节我们讲了个人博客用什么开发语言,用什么CMS系统,从这一节我们就开始真正的干货,这一节我们讨论一下PHP环境的安装,及个人博客后台的搭建,让你的博客在正常的PHP环境中运行起来,你就可以进行后台 ...

  3. Java:API文档;文档注释中的javadoc标记;官方API;自己动手给项目建一个API文档

    1.什么是API文档 在Java语言中有3种注释 //单行注释 /* 多行注释 */ /** * 文档注释 */ API(应用程序接口)文档就是用javadoc命令提取文档注释生成的,html格式,用 ...

  4. Swift 产生 uuid

    项目中.需要客户端生成一个唯一的识别码 let uuid = UUID().uuidString print(uuid)

  5. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  6. Python多线程操作

    多线程是一门编程语言的重要操作. GIL(全局解释器锁)存在于python解释器中,用来确保当前只有一个线程被执行,当一个线程获得GIL后,这个线程将被执行,退出时释放GIL,由下一个获得GIL的线程 ...

  7. 【网站公告】请大家不要发表任何涉及“得到App”的内容

    大家好,今天我们收到来自杭州某某网络科技有限公司的维权骑士团队的邮件,说他们受某某(天津)文化传播有限公司委托,展开维权.园子里有些博主因为学习“得到App”的课程在博客中记了一些笔记,也被维权. 为 ...

  8. javascript错误信息

    ECMA-262 定义了下列 7 种错误类型: TypeError 类型错误 ReferenceError 引用错误 SyntaxError 语法错误 Error 错误 EvalError 全局错误 ...

  9. 通俗理解ZooKeeper是如何保证数据一致性的

    https://blog.csdn.net/liuhaiabc/article/details/70771322 https://blog.csdn.net/zhaoyangjian724/artic ...

  10. Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤

    Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述——    隐鹤 1. 引言 Excel任务窗格是一个可以用来存放各种常用命令的侧边窗口(准确的说是一个可以停靠在类名为x ...