前置芝士:可持久化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. [转载]css菜鸟之HTML 中块级元素设置 height:100% 的实现

    HTML 中块级元素设置 height:100% 的实现 当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果. 为什 ...

  2. Snowflake(雪花算法)的JavaScript实现

    现在好多的ID都是服务器端生成的,当然JS也可以生成GUID或者UUID之类的,但是如果想要有序……这时就想到了雪花算法,但是都知道JS中Number的最大值为Number.MAX_SAFE_INTE ...

  3. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)

    题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...

  4. 超简单的canvas绘制地图

        本文使用geojson数据,通过缩放和平移把地图的地理坐标系转换canvas的屏幕坐标系,然后将转换后的数据绘制到canvas上.     首先要计算数据的最大最小值,遍历所有坐标点的最大最小 ...

  5. JAVA 四舍五入Math.round方法

    今天由于测试场景,利息的计算中涉及小数点的保留.保留的规则是:两位小数+四舍五入方式 使用的语言是JAVA, 看了许多网上的方法.因为最后保留的小数还会进行计算.所以我考虑最好不要保留的结果是Stri ...

  6. sql 上舍下舍運用

    [四舍五入取整截取] select round(54.56,0) [向下取整截取] SELECT FLOOR(54.56) [向上取整截取]  SELECT   CEILING(13.15) --MS ...

  7. lua_local变量在new时不会被清空

    前言 我的运行环境 Lua5.3 按照我们以往的Java或C#编程经验,如果一个class被new,那么这个class中所有成员变量的值都是默值或是构造函数中赋的值,但在Lua中的local变量却并不 ...

  8. 如何连接别人电脑上的Oracle数据库?

    需要一些前提条件: 1.对方的主机能被连接(如在同一局域网内) 2.需要知道对方数据库IP.端口号.服务名 3.需要知道对方提供的管理数据库的用户名及密码 连接方法: 1.在本地的oracle安装目录 ...

  9. python接口自动化-post请求4

    云盘登录实操案例: 代码参考: # coding:utf-8 import requests ''' https的请求相对于http安全级别高,需要验证SSL证书 import urllib3 使用这 ...

  10. 文本相似度 — TF-IDF和BM25算法

    1,$TF-IDF$算法 $TF$是指归一化后的词频,$IDF$是指逆文档频率.给定一个文档集合$D$,有$d_1, d_2, d_3, ......, d_n \in D$.文档集合总共包含$m$个 ...