洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283
小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。
小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n。第 ii 种馅儿具有一个非负整数的属性值 a_i。每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子。小粽准备用这些馅儿来做出 k 个粽子。
小粽的做法是:选两个整数数 l, r,满足 1⩽l⩽r⩽n,将编号在 [l,r] 范围内的所有馅儿混合做成一个粽子,所得的粽子的美味度为这些粽子的属性值的异或和。(异或就是我们常说的 xor 运算,即 C/C++ 中的
ˆ
运算符或 Pascal 中的xor
运算符)小粽想品尝不同口味的粽子,因此它不希望用同样的馅儿的集合做出一个以上的 粽子。
小粽希望她做出的所有粽子的美味度之和最大。请你帮她求出这个值吧!
UPD:手痒了于是还是把代码写了……
不要在意我只是突然诈了一个尸。
以及场外选手题解口胡之后看了一下正解发现差不多?
正好一直想要诈一个尸,就用这个诈一个尸吧。
顺(主)便(要)聊聊心路历程。
——————
看到异或取最大第一眼想到线性基,然后看到连续的数就想到了BZOJ3261:最大异或和 。(天哪我记性真好一年前的东西我还记得)
然而此时并看不出二者的关系。
然后想暴力,枚举$O(n^2)$,但$k$与$n$并非一个数量级的。
于是想到了BZOJ2006:[NOI2010]超级钢琴 对前$k$大值的处理方法。(天哪我记性真好一年前的东西我还记得*2)
而超级钢琴那道题我们是用了st表维护的,但是异或显然不能用st表维护。
那就可持久化trie呗!顺理成章的联系到了一起。
于是题解如下:首先预处理前缀异或和$s$,建立可持久化trie,则原$[l,r]$的异或和即为$s[r] \; xor \; s[l-1]$。
于是固定$l$求$r$使得$s[r] \; xor \; s[l-1]$尽可能的最大(设为$w$吧),然后将这些信息一起扔到堆里面(同时我们把$r$所在的范围$L,R$一起扔里面)。
每次弹出一个$(l,r,w,L,R)$的时候,我们就要找第二大的$[l,r]$扔进去,超级钢琴告诉我们,第二大的$r$一定在$[L,r-1]$和$[r+1,R]$当中,我们干脆把区间分成两份各求一遍直接都扔进去就好了。
复杂度一个建trie$O(nloga_i)$一个预处理$O(nloga_i)$一个弹$O(kloga_i)$。
(老年选手不会算复杂度了不知道对不对orz)
另外洛谷需要开O2
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=5e5+;
const int B=;
inline ll read(){
ll X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int son[],sum,num;
}tr[*N];
int tot,rt[N],pool;
ll s[N];
void insert(int y,int &x,ll k,int pos,int now){
tr[x=++pool]=tr[y];tr[x].sum++;
if(now<){tr[x].num=pos;return;}
bool p=k&(1LL<<now);
insert(tr[y].son[p],tr[x].son[p],k,pos,now-);
return;
}
int query(int nl,int nr,ll k,int now){
if(now<)return tr[nr].num;
bool p=k&(1LL<<now);
int delta=tr[tr[nr].son[p^]].sum-tr[tr[nl].son[p^]].sum;
if(delta>)return query(tr[nl].son[p^],tr[nr].son[p^],k,now-);
else return query(tr[nl].son[p],tr[nr].son[p],k,now-);
}
struct data{
int l,r;
ll w;
int L,R;
bool operator <(data b)const{
return w<b.w;
}
};
priority_queue<data>q;
int main(){
int n=read(),k=read();
for(int i=;i<=n;i++)s[i]=s[i-]^read();
for(int i=;i<=n;i++)insert(rt[i-],rt[i],s[i],i,B);
for(int i=;i<=n;i++){
int l=i;int r=query(rt[l-],rt[n],s[l-],B);
q.push((data){l,r,s[r]^s[l-],l,n});
}
ll ans=;
while(k--){
data tmp=q.top();q.pop();
ans+=tmp.w;
int i=tmp.l,j=tmp.r;
if(tmp.L<=j-){
int t=query(rt[tmp.L-],rt[j-],s[i-],B);
q.push((data){i,t,s[t]^s[i-],tmp.L,j-});
}
if(j+<=tmp.R){
int t=query(rt[j],rt[tmp.R],s[i-],B);
q.push((data){i,t,s[t]^s[i-],j+,tmp.R});
}
}
printf("%lld\n",ans);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解的更多相关文章
- 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)
点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...
- [LOJ3048] [十二省联考2019] 异或粽子
题目链接 LOJ:https://loj.ac/problem/3048 洛谷:https://www.luogu.org/problemnew/show/P5283 Solution 考虑每个子串都 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- [十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
- LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题
题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...
随机推荐
- 《Redis设计与实现》阅读笔记(四)--字典
字典 字典,map,是用于保存键值对的抽象数据结构,是hash表实现.字典中的键唯一,通过键来操作值.Redis的数据库使用字典来作为底层实现. 定义 Redis的字典使用哈希表作为底层实现,一个哈希 ...
- jsp标签在JavaScript中使用时,可能会出现的一个问题。
直接上代码 <script type="text/javascript"> var E = window.wangEditor; var editor = new E( ...
- SQL Operations Studio的安装和使用
之前管理和访问SQL SERVER使用的自然是SSMS,功能确实很强大的一个数据库图形化管理软件,但是SSMS有个问题就是体积超级大,启动速度也就比较慢.今天我正好要学习一些T-SQL的内容,在微软的 ...
- MFC -- Excel操作简介(基于VS2010)
一.添加与 Excel 操作相关的头文件 项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文 ...
- 程序设计 之 C#实现《拼图游戏》 (上)代码篇
原理详解请参考博客中 拼图游戏(下)原理篇 http://www.cnblogs.com/labixiaohei/p/6713761.html 功能描述: 1.用户自定义上传图片 2.游戏难度选择:简 ...
- python基础知识-12-模块的了解
python其他知识目录 1.模块介绍: Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你 ...
- Refs 和 DOM
在常规的 React 数据流中,props 是父组件与子组件交互的唯一方式.要修改子元素,你需要用新的 props 去重新渲染子元素.然而,在少数情况下,你需要在常规数据流外强制修改子元素.被修改的子 ...
- spring冲刺第八天
昨天使人物成功的在地图上运动,并设计炸弹爆炸效果. 今天使炸弹可以炸死人物并可以炸没砖块,并试着将小怪加入地图. 遇到的问题:现在还没有将小怪加入地图,各个模块的整合是比较麻烦的,我还要在这方面下点功 ...
- Task 6.2站立会议三
今天我完成了软件的主要聊天界面的视频通话和语音通话的部分功能,过程中遇到很多不会的知识.因为使用的是C#,虽然很容易上手但是还会存在很多不懂得内容.
- Code128
条形码 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案.条形 ...