[十二省联考2019] 异或粽子 - 可持久化Trie,堆
求 \(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,堆的更多相关文章
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- [十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- [十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
- Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...
随机推荐
- http报文解析
http报文结构 报文首部 起始行 请求报文的起始行: 方法(method) request-URL version(http协议版本) 响应报文的起始行 HTTP响应码 请求头 通用首部 请求首部 ...
- 生成JavaDoc文档
JavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了.在简略介绍JavaDoc写法之后,再看一下在Intellij Idea 中如何将代码中的注释 ...
- mysql必知必会--使用数据处理函数
函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据.函数 一般是在数据上执行的,它给数据的转换和处理提供了方便. 在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子 函数没有 ...
- 消息队列MQ(一)
消息队列 为什么要用消息队列,都有什么优缺点? 要问的是消息队列都有哪些场景,然后项目里具体实现的什么场景,你在这个场景里用的什么消息队列? 期望的回答是,你们公司有个什么业务,这个业务场景有什么技术 ...
- 【公告】Hello World!
Hi! 这里 是 华中师大一附中 2019 级信息组 官方博客 ! ^_^ 我们将在这里分享一些难题的做法,帮助大家共同学习. 也欢迎同是OIer的你加入我们哦!
- html网页基本结构
<!DOCTYPE> 不是 HTML 标签.它为浏览器提供一项信息(声明),即 HTML 是用什么版本编写的. HTML5 DOCTYPE 的 HTML 文档类型如下: <!DOCT ...
- 10maven依赖继承、统一版本/编码
A > B > C A依赖于B,B依赖于C,如果A想间接依赖C,那么B和C之间的依赖范围必须是compile,不然A依赖不了C 但是有点麻烦,因为每次A想依赖于C都要确认B和C之间的 ...
- 码云配合git入门命令总结学习
目录 码云配合git入门命令总结学习 基本设置 基本命令总结学习 准备工作以及基本思路 基本命令 码云搭建仓库步骤 准备前工作 具体操作方法 远程仓库基本命令 标签相关命令 所有命令总结 基本命令总结 ...
- Python小白
.IDLE软件为内建于CPython的集成开发环境(IDE),包括编辑器,编译或解释器,调试器 .py(后缀保存) 2.行一,单行注释 多行,””” ‘’’ 之后,内建 ...
- Django如何连接mysql
1.设置django的mysql驱动为pymysql 因为django默认的是使用MySqlDb连接mysql数据库,但是由于该模块不支持python3.4以上版本,所以使用pymysql模块 在项目 ...