LG5283 异或粽子
题意
共有\(n\)个数,选择\(k\)个不同的\([l,r]\)区间,使得它们的异或和最大
$ 1 \leq n \leq 5 \times 10^5,k \leq 2 \times 10^5$
思路
先会想到前缀异或和,这样求\([l,r]\)区间异或和只需要用\(pre[l-1]\oplus pre[r]\)以此减少运算次数。然后由于是异或,又会想到\(trie\),然后想一想,好像要用可持久化!!!完了太菜了不会。
但为了偷懒,必须思考。思考过后发现,不用可持久化,\([l,r]\)区间算\([l,r],[r,l]\)两次,答案再除二就好了
#include <bits/stdc++.h>
using std::priority_queue;
const int N=500005;
long long trie[N<<5][2],a[N],x,ans;
int tot=1,n,k,size[N<<5];
struct note{
int x,rk;
long long w;
bool operator < (const note &a)const{return w<a.w;}
};
priority_queue <note> q;
long long read(){
long long t=0;
char c=getchar();
while (c<'0' || c>'9')
c=getchar();
while (c>='0' && c<='9') t=t*10+c-'0',c=getchar();
return t;
}
void add(long long x){
int u=1;
for (int i=31;i>=0;i--){
int t=(x>>i)&1;
size[u]++;
if (!trie[u][t]) trie[u][t]=++tot;
u=trie[u][t];
}
size[u]++;
}
long long query(long long x,int k){
long long ans=0;
int u=1;
for (int i=31;i>=0;i--){
int t=(x>>i)&1;
if (trie[u][t^1] && size[trie[u][t^1]]>=k)
u=trie[u][t^1],ans^=1LL<<i;
else k-=size[trie[u][t^1]],u=trie[u][t];
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
x=read();
a[i]=a[i-1]^x;
add(a[i]);
}
add(0);
for (int i=0;i<=n;i++) q.push(note{i,1,query(a[i],1)});
for (int i=1;i<=k*2;i++){
note t=q.top();q.pop();
ans+=t.w;
if (t.rk<=n) q.push(note{t.x,t.rk+1,query(a[t.x],t.rk+1)});
}
printf("%lld",ans/2);
}
上海省选浪的太开心了,太菜了第二天\(99\)难受
LG5283 异或粽子的更多相关文章
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- [十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...
- LOJ3048 「十二省联考 2019」异或粽子
题意 题目描述 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具 ...
- 『异或粽子 堆 可持久化trie』
异或粽子 Description 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n.第 i 种馅儿 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
- P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...
- 「十二省联考 2019」异或粽子——tire树+堆
题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅 ...
随机推荐
- Unity Cube一面显示图片
Cube加plane 把plane调整到和cube的一面一样大小,并放到那一面的位置,然后再Hierarchy面板选中plane,把图片拖到Inspector的plane下.
- Unity上线google商店 用IL2Cpp打包64位版本和Android APP Bundle优化 及产生的bug
ios刚上线,这边着手改成android版本,我开始使用的是unity2017.4.1版本 上传谷歌商店是出现这两个警告: 要支持64位,但是在2017版本上没有找到64位的打包选项,猜测应该是版本的 ...
- Sharepoint2010设置自定义母版页
前言 这个文档是为Microsoft Sharepoint2010 上海文档库公司站点设计的母版页,其版本为1.0,为相关的源文件编写的使用说明书. 使用SharePoint Designer 201 ...
- Spark机器学习API之特征处理(一)
Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...
- mpvue + 微信小程序 picker 实现自定义多级联动 超简洁
微信小程序官网只提供了省市区的三级联动,实际开发中更多的是自定义的多级联动: 依照微信小程序官网提供的自定义多级联动,需要使用到picker 的多列选择器,即设置 mode = multiSelect ...
- 连接Linux远程桌面的几个方法
有下面五种方法: 一.通过xshell或putty直接调用程序窗口(通过ssh命令行连接). 二.通过xbrower连接Linux完整的桌面. 通过xshell直接调用程序窗口. rhel5的gdm的 ...
- datagrid如何获取选中行的索引
//datagrid获取选中行 var row =baseSelectgrid.datagrid('getSelected'); // 获取被选中行的索引 index var index=baseSe ...
- redis __详解 (转载自作者:孤独烟 出处: http://rjzheng.cnblogs.com/)
https://www.cnblogs.com/rjzheng/p/9096228.html [原创]分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲> ...
- php连接oracle oracle开启扩展
<?php /** * 由于公司的需要,使用php+oracle开发项目,oracle因为有专门人员开发设计,我们只需远程调用 *于是乎遇到了蛋疼的问题就是开启oracle扩展的问题,虽然你在p ...
- VS---《在VS2010中 使用C++创建和使用DLL》(002)
VS---<在VS2010中 使用C++创建和使用DLL>(002) 前面初认识了创建和调用DLL,在VS工程下可以通过在 同一工程.不同工程 下创建和调用DLL.现在,同一工程下创建和调 ...