P5283-[十二省联考2019]异或粽子【可持久化Trie,堆】

正题

题目链接:https://www.luogu.org/problemnew/show/P5283


题目大意

给定一个序列,求kkk个不同的的[l..r][l..r][l..r]的区间异或值的和最大。


解题思路

先让ai=aixorai−1a_i=a_i\ xor\ a_{i-1}ai=ai xor ai1(异或前缀和)。
然后现在问题变成了求kkk对最大的alxorara_l\ xor\ a_ral xor ar的和。

我们考虑TrieTrieTrie,之前在The XOR Largest Pair这道题中讲过如何用TrieTrieTrie求最大的异或对,然后我们考虑要求不重复。

我们开一个堆,堆中储存一个五元组(l,r,x,id,val)(l,r,x,id,val)(l,r,x,id,val),其中ididid表示在[l..r][l..r][l..r]区间中axxoraid−1a_x\ xor\ a_{id-1}ax xor aid1最大。然后val=axxoraid−1val=a_x\ xor a_{id-1}val=ax xoraid1
然后按照valvalval从大到小来。每次ididid可以用可持久化TrieTrieTrieO(31)O(31)O(31)的时间内求出。

然后开始时先将(1,i,i,id,val)(1,i,i,id,val)(1,i,i,id,val)放入。每次取出一个最顶的统计入答案然后将(l,id−1,x,id,val)(l,id-1,x,id,val)(l,id1,x,id,val)(id+1,r,x,id,val)(id+1,r,x,id,val)(id+1,r,x,id,val)放入就好了。

然后证明这个的正确性(其实十分显然)。因为对于axa_xax的目前最优在ididid处而两个区间都不包含ididid所以正确。

时间复杂度O(((n+k)log⁡(n+k))+31k)O(\ ((n+k)\log (n+k))+31k)O( ((n+k)log(n+k))+31k)(我不知道有没有错)


codecodecode

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cctype>
#define ll long long
using namespace std;
const ll N=5e5+10,W=31;
ll n,k,a[N],ans;
inline ll read()
{register ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return (f==1)?x:-x;
}
struct Trie_node{ll a[N*40][2],last[N*40];ll root[N],tot;void Insert(ll val,ll k,ll id,ll p,ll q){if(k<0){last[q]=id;return;}ll c=val>>k&1;if(p) a[q][c^1]=a[p][c^1];a[q][c]=++tot;Insert(val,k-1,id,a[p][c],a[q][c]);last[q]=max(last[a[q][0]],last[a[q][1]]);}ll Ask(ll now,ll val,ll k,ll limit){if(k<0) return last[now];ll c=(val>>k)&1;if(last[a[now][c^1]]>=limit)return Ask(a[now][c^1],val,k-1,limit);elsereturn Ask(a[now][c],val,k-1,limit);}
}Trie;
struct node{ll l,r,x,id,val;node(ll _l=0,ll _r=0,ll _x=0){l=_l;r=_r;x=_x;id=Trie.Ask(Trie.root[r],a[x],W,l);val=a[x]^a[id-1];//printf("(%d,%d,%d,%d)|",l,r,x,id);}
};
bool operator <(const node &a,const node &b)
{return a.val<b.val;
}
priority_queue<node> Heap;
int main()
{n=read();k=read();Trie.root[0]=1;for(ll i=1;i<=n;i++){a[i]=a[i-1]^read();Trie.root[i]=++Trie.tot;Trie.Insert(a[i-1],W,i,Trie.root[i-1],Trie.root[i]);}for(ll i=1;i<=n;i++)Heap.push(node(1,i,i));while(k--){node x=Heap.top();Heap.pop();ans+=x.val;if(x.l<x.id) Heap.push(node(x.l,x.id-1,x.x));if(x.r>x.id) Heap.push(node(x.id+1,x.r,x.x));}printf("%lld",ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES快速入门

转载自 ES快速入门 3 ES快速入门 ES作为一个索引及搜索服务&#xff0c;对外提供丰富的REST接口&#xff0c;快速入门部分的实例使用head插件来测试&#xff0c;目的是对ES的使用方法及流程有个初步的认识。 3.1 创建索引库 ES的索引库是一个逻辑概念&#xff0c;它包括了分…

05-传统开发模式DAO

传统开发模式DAO 目录 定义接口 CustomerDao.java实现接口 CustomerDaoImpl.java测试类在传统开发模式DAO下&#xff0c;我们自己先定义好接口&#xff0c;然后再去定义实现类&#xff0c;在实现类中实现接口的操作。到时候只需要创建一个 dao 对象&#xff0c;即可调用其中的…

AspnetCore 2.0 自动API文档生成组件,支持protobuffer

关于API文档自动生成&#xff0c;用于对APP端的开发帮助文档生成&#xff0c;默认ProtoBuffer传输格式。本项目并不是RESTful风格&#xff0c;是面向功能的API类型。ApiDoc的作用是根据定义好的API接口和注释来自动生成给内部开发者提供的API对接文档。欢迎Star一下&#xff0c…

P5127-子异和【线段树,树链剖分,位运算】

正题 题目链接:https://www.luogu.org/problemnew/show/P5127 题目大意 定义一个序列的子异和为所有自己的异或和的和。 然后有点权的树&#xff0c;要求支持路径异或和路径求子异和。 解题思路 首先树链剖分是肯定的&#xff0c;然后我们考虑用哪个数据结构。 从每个位单独…

06-Mapper动态代理

Mppaer 动态代理 目录 创建 Mapper 工程定义接口的要求测试类Mapper 中参数传递单个参数多个参数param命名参数多个参数封装成 Map多个参数之 POJO参数处理源码分析之前我们一直都使用传统开发模式DAO&#xff0c;即定义接口&#xff0c;然后定义实现类。这个其实是较为繁琐的…

ASP.NET Core MVC中的 [Required]与[BindRequired]

在开发ASP.NET Core MVC应用程序时&#xff0c;需要对控制器中的模型校验数据有效性&#xff0c;元数据注释(Data Annotations)是一个完美的解决方案。元数据注释最典型例子是确保API的调用者提供了某个属性的值&#xff0c;在传统的ASP.NET MVC中使用的是RequiredAttribute特性…

ES集群管理

转载自 ES集群管理 8 集群管理 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下…

【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Java的注释方式二. 标识符三. 关键字四. 全篇总结 &#x1f4d1;前言 在Java编程…

P5290-[十二省联考2019]春节十二响【贪心,堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P5290 题目大意 将一棵树的所有节点分城若干个组。每个组的价格是这个组中价格最大的点&#xff0c;要求这个组中没有任何祖孙关系。 求所有组的权值和最小。(1号为根节点) 解题思路 我们先想10,11,1210,11,1210,11,12…

07-MyBatis 核心配置文件

MyBatis 核心配置文件 目录 properties 定义属性及读取属性文件settings 设置运行时行为typeAliases 类型别名定义单个别名批量定义别名typeHandlers 类型处理器Plugins&#xff08;后续有文章专门介绍这个&#xff09;Environments 运行环境databaseIDProvider 定义数据库厂…

Office 365也是.NET Core应用开发新战场

最近有幸阅读了陈希章花了一年时间为国内开发者贡献的《Office 365 开发入门指南》。 虽然早期接触过SharePoint的开发&#xff0c;2007年之后就再也没有接触SharePoint的开发&#xff0c;这次阅读这本书让我重新认识了Office的系统开发技术&#xff0c;让我意识到现在的Office…

jzoj4802-[GDOI2017模拟9.24]探险计划【费用流,拆点】

正题 题目大意 一个nnn行的不完全矩阵第iii行有mi−1mi-1mi−1个格子&#xff0c;然后每个格子有危险度。 每次可以从(i,j)(i,j)(i,j)走到(i−1,j)(i-1,j)(i−1,j)或(i−1,j−1)(i-1,j-1)(i−1,j−1) 求 m次&#xff0c;每个格子和路不可以重复走的最小危险度。m次&#xff0…

Scala与Java差异(一)之基础语法

一、Scala解释器的使用 &#xff08;1&#xff09;REPL Read&#xff08;取值&#xff09;-> Evaluation&#xff08;求值&#xff09;-> Print&#xff08;打印&#xff09;-> Loop&#xff08;循环&#xff09;。 scala解释器也被称为REPL&#xff0c;会快速编译…

08-输出类型

输出类型 目录 输出简单类型输出 Map 类型key:列名 value:列名对应的值key:自己指定的列 value:自定义对象resultMap输出简单类型 CustomerMapper.java&#xff1a;返回值为简单类型。 public interface CustomerMapper {/*查询总数*/public Integer getAccountCustomer();…

在Ubuntu 16.04环境下安装Docker-CE(附视频教程)

“ 任何的课程都逃不开理论的支持”久等了各位&#xff0c;上一篇说Docker开始的消息已经过去了一周多的时间&#xff0c;今天推送的消息是告诉大家视频可以学习了&#xff01;52ABP .NET CORE QQ群 : 633751348大纲Docker的介绍Ubuntu下安装Docker快速体验Docker利用Docker搭…

jzoj4800-[GDOI2017模拟9.24]周末晚会【dp,循环重构】

正题 题目大意 nnn个人的圆桌&#xff0c;可以放男可以放女&#xff0c;然后要求不能有连续kkk个女生坐在一起。求方案总数。 解题思路 先不考虑圆桌&#xff0c;设fi,jf_{i,j}fi,j​表示放了i个人&#xff0c;最前面有连续jjj个女生&#xff0c;动态转移方程显然 fi,jfi−1,j…

Scala与Java差异(二)之条件控制与循环

一、if表达式 &#xff08;1&#xff09;if表达式的定义 在Scala中&#xff0c;if表达式是有值的&#xff0c;就是if或者else中最后一行语句返回的值。 例如&#xff0c;val age 30; if (age > 18) 1 else 0 可以将if表达式赋予一个变量&#xff0c;例如&#xff0c;va…

WebApi client 的面向切面编程

.Net的面向切面编程.Net的服务端应用AOP很常见&#xff0c;在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子&#xff0c;我们可以把一个服务方法“切”为很多面&#xff0c;日志面、验证面、请求方式处理、接口业务实现等多个面&#xff0c;有一些面可以使用过滤器特…

09-一对多关系建表

多表操作 目录 表之间关系一对多关系建表原则表之间关系 一对一关系&#xff1a;一夫一妻。 一对多关系&#xff1a; 一个部门有多个员工&#xff0c;一个员工只能属于某一个部门。 一个班级有多个学生&#xff0c;一个学生只能属于一个班级。 多对多关系&#xff1a; 一个…

jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】

正题 题目大意 一个序列&#xff0c;给定若干个区间[l..r][l..r][l..r] 从l∼rl\sim rl∼r任意一个位置出发&#xff0c;见到比手中大的数字就交换&#xff0c;到rrr求最小的交换次数 (注意&#xff0c;并不是真的交换) 解题思路 首先算出每个点的后继(在它后面第一个比他大的…