求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大。

Solution

(差点又看错题了)

做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对

建一棵可持久化 0-1 Trie,这样我们就可以 \(O(log n)\) 求出对于某个右端点,它的所有可能答案中,第 \(k\) 大的答案

然后利用堆来维护答案。我们先把对每一个右端点,第 \(1\) 大的答案插入堆。然后循环弹出。每次弹出一个,如果它是 \(u\) 这个右端点对应的第 \(v\) 大的答案,我们就计算出 \(u\) 这个右端点对应的第 \(v+1\) 大的答案(如果存在的话)并且把它插入堆,然后继续。

#include <bits/stdc++.h>
using namespace std; #define int long long const int N = 1000005; namespace trie {
int ind,ch[N*40][2],siz[N*40],root[N*40];
void insert(int id,int x) {
root[id]=++ind;
ch[ind][0]=ch[root[id-1]][0];
ch[ind][1]=ch[root[id-1]][1];
siz[ind]=siz[root[id-1]]+1;
int p=ind;
for(int i=39;i>=0;--i) {
int t=(x>>i)&1;
++ind;
ch[ind][0]=ch[ch[p][t]][0];
ch[ind][1]=ch[ch[p][t]][1];
siz[ind]=siz[ch[p][t]]+1;
ch[p][t]=ind;
p=ind;
}
}
int query(int id,int x,int k) {
int p=root[id],ans=0;
for(int i=39;i>=0;--i) {
int t=(x>>i)&1;
if(siz[ch[p][t^1]]>=k) {
p=ch[p][t^1];
ans|=1ll<<i;
}
else {
k-=siz[ch[p][t^1]];
p=ch[p][t];
}
}
return ans;
}
} struct pii {
int a,b,c;
bool operator < (const pii &x) const {
return a < x.a;
}
}; priority_queue <pii> q;
int n,k,a[N],ans; signed main() {
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++) {
scanf("%lld",&a[i]);
a[i]^=a[i-1];
}
for(int i=0;i<=n;i++) {
trie::insert(i,a[i]);
}
for(int i=1;i<=n;i++) {
q.push((pii){trie::query(i-1,a[i],1),i,1});
//cout<<trie::query(i-1,a[i],1)<<" ";
}
//cout<<endl;
for(int i=1;i<=k;i++) {
int val=q.top().a,pos=q.top().b,idx=q.top().c;
ans+=val;
//cout<<val<<endl;
q.pop();
if(idx<pos) {
q.push((pii){trie::query(pos-1,a[pos],idx+1),pos,idx+1});
}
}
cout<<ans;
}

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

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

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

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

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

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

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

  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. [十二省联考2019]异或粽子(堆+可持久化Trie)

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

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

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

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

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

随机推荐

  1. P3078 [USACO13MAR]Poker Hands S

    链接:Miku ---------------- 这道题和线段树有什么关系 --------------- 很简单的贪心,如果一堆牌比左边的大,那么肯定是要加上他的差的 反正,顺手出掉就可以了 --- ...

  2. python——面向对象(3),搬家具

    """date: 2020.2.9搬家具:将小于房子剩余面积的家具搬进房子1.定义家具类,房屋类""" class Furniture(): ...

  3. 《手把手教你构建自己的 Linux 系统》学习笔记(6)

    目录 /dev 目录是干什么的? /proc 和 /sys 目录是干什么的? udev 这个软件是干什么用的? 目录映射是临时性的,还是永久性的? 命令行里大括号 "{}" 的作用 ...

  4. 0.96寸OLED显示屏驱动手册(SSD1306)

    MCU IIC接口 IIC通信接口由从地址位SA0,IIC总线数据信号SDA(输出SDAout/D2和输入SDAin /D1)和IIC总线时钟信号SCL(D0).不管是数据线还是时钟线都需要连接上拉电 ...

  5. PHP0016:PHP http协议

    post提交请求头

  6. python数据类型(第一弹)

    作为一门计算机编程语言,python与其它语言一样,设有若干种数据类型,准确掌握各种数据类型的常用方法是精通python的必要条件,也是熟练使用各数据类型.最大限度发挥它们功能的基本条件. pytho ...

  7. 监控redis cluster 主从实例是否切换,切换前后对应关系

    需求:编写脚本实现对redis cluster 主从是否发生主从切换进行监控,若发生切换,输出切换前后主从对应关系. 初始化对比文件,仅执行一次,后续不需要在执行,除非该文件不存在. cmd=&quo ...

  8. 优酷爱奇艺视频转换为MP4格式工具

    本君今天分享两个免费的视频格式转换工具,分别是爱奇艺和优酷的(腾讯的有点复杂,等整理完再分享).教程都是一步步亲手操作的,每一步都有配图.希望各位老板多转发分享,谢谢! 一爱奇艺QSV转MP4格式 解 ...

  9. postman请求(请求方式、请求url、请求参数、参数类型、请求头)

    请求方式:get 请求地址: 请求参数:url与参数用?间隔,多个参数用&间隔 请求方式:post 请求地址: 请求参数: 请求参数格式:前面两种是key-value.第三种可以选择json/ ...

  10. formateDate

    function formateDate(fmt, date) { let _this = new Date(date) let o = { "M+": _this.getMont ...