求 \(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. http报文解析

    http报文结构 报文首部 起始行 请求报文的起始行: 方法(method) request-URL version(http协议版本) 响应报文的起始行 HTTP响应码 请求头 通用首部 请求首部 ...

  2. 生成JavaDoc文档

    JavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了.在简略介绍JavaDoc写法之后,再看一下在Intellij Idea 中如何将代码中的注释 ...

  3. mysql必知必会--使用数据处理函数

    函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据.函数 一般是在数据上执行的,它给数据的转换和处理提供了方便. 在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子 函数没有 ...

  4. 消息队列MQ(一)

    消息队列 为什么要用消息队列,都有什么优缺点? 要问的是消息队列都有哪些场景,然后项目里具体实现的什么场景,你在这个场景里用的什么消息队列? 期望的回答是,你们公司有个什么业务,这个业务场景有什么技术 ...

  5. 【公告】Hello World!

    Hi! 这里 是 华中师大一附中 2019 级信息组 官方博客 ! ^_^ 我们将在这里分享一些难题的做法,帮助大家共同学习. 也欢迎同是OIer的你加入我们哦!

  6. html网页基本结构

    <!DOCTYPE> 不是 HTML 标签.它为浏览器提供一项信息(声明),即 HTML 是用什么版本编写的. HTML5 DOCTYPE 的 HTML 文档类型如下: <!DOCT ...

  7. 10maven依赖继承、统一版本/编码

    A >  B  >  C A依赖于B,B依赖于C,如果A想间接依赖C,那么B和C之间的依赖范围必须是compile,不然A依赖不了C 但是有点麻烦,因为每次A想依赖于C都要确认B和C之间的 ...

  8. 码云配合git入门命令总结学习

    目录 码云配合git入门命令总结学习 基本设置 基本命令总结学习 准备工作以及基本思路 基本命令 码云搭建仓库步骤 准备前工作 具体操作方法 远程仓库基本命令 标签相关命令 所有命令总结 基本命令总结 ...

  9. Python小白

      .IDLE软件为内建于CPython的集成开发环境(IDE),包括编辑器,编译或解释器,调试器       .py(后缀保存) 2.行一,单行注释     多行,”””    ‘’’  之后,内建 ...

  10. Django如何连接mysql

    1.设置django的mysql驱动为pymysql 因为django默认的是使用MySqlDb连接mysql数据库,但是由于该模块不支持python3.4以上版本,所以使用pymysql模块 在项目 ...