https://www.luogu.org/problemnew/show/P5283

https://loj.ac/problem/3048

小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。

小粽面前有 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]异或粽子——题解的更多相关文章

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

    点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...

  2. [LOJ3048] [十二省联考2019] 异或粽子

    题目链接 LOJ:https://loj.ac/problem/3048 洛谷:https://www.luogu.org/problemnew/show/P5283 Solution 考虑每个子串都 ...

  3. 【简】题解 P5283 [十二省联考2019]异或粽子

    传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...

  4. 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)

    [BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...

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

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

  6. [十二省联考2019]异或粽子 01trie

    [十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...

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

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

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

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

  9. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

随机推荐

  1. SpringCloud 学习(二)-1 :服务注册与发现Eureka扩展

    上一篇介绍了Eureka Server的搭建跟配置.Eureka Client的搭建跟配置.服务间通过服务名调用等,还有几个实际实验中遇到的问题及处理方案,本篇来玩一下Eureka的其他配置. 上一篇 ...

  2. 【坚持】Selenium+Python学习记录 DAY11

    2018/06/1-2018/06/4 参考资料: [菜鸟教程](http://www.runoob.com/python3/python3-examples.html) [Python解惑:True ...

  3. HTML学习1-Dom之事件绑定

    事件: 1.注册事件 a. <div onxxxx=””></div> b. document  .onxxxx= function()  //找到这个标签 2.this,触发 ...

  4. Django缓存配置和使用

    - 缓存 - 配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCAT ...

  5. 关于SQL while 循环嵌套 外部循环数据无法进入内部循环

    下面一般是,作为SQL新手第一次写循环嵌套的办法,但是大家会发现一个问题,那就是变量@i总是不能进入第二个循环. declare @i int ,@j int, @k int set @j = 1 - ...

  6. dirname命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/xiaofei125145/article/details/50620281 示例一 来自手册页的例子 $ dirname ...

  7. WinForm中从SQLite数据库获取数据显示到DataGridView

    1.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程 ...

  8. Scrum Meeting 6 -2014.11.12

    今天apec最后一天,大部分任务都差不多了,局部测试问题不大.大家修复下小细节就可以开始整合了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助测试及服 ...

  9. servlet基础学习总结

    Servlet的任务 1.  读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单 2.  读取客户端发送的隐式的数据,包括cookies.媒体类型等 3.  处理数据并产生结果 4.  ...

  10. YQCB冲刺第二周第一天

    今天的任务为实现查看消费明细的功能. 遇到的问题是按类别显示. 站立会议为: 任务面板为: