P5283 [十二省联考2019]异或粽子
考场上想到了没打完,细节思路还是不是很优,我原先的想法是每一次找完后标记那个点,下次再继续找(并不是这个意思,说不清楚)但实际上和平衡树一样加个大小就很好写了
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=500005; const int DEP=31; int N,M; ll ans,s[MAXN]; struct node{ ll val; int x,k; bool operator <(const node& A) const { return val<A.val; } }; priority_queue<node> q; struct Node{ int ch[2],sum; }trie[MAXN*(DEP+2)]; int head[MAXN],cnt; void insert(Node c,Node& u,ll val,int d){ u.sum=c.sum+1; if(d<0) return; int x=(val>>d)&1ll; u.ch[!x]=c.ch[!x]; insert(trie[c.ch[x]],trie[u.ch[x]=++cnt],val,d-1); } ll query(Node u,ll val,int d,int k){ if(d<0) return 0; int x=(val>>d)&1; int lsum=trie[u.ch[!x]].sum; if(lsum>=k) return ((ll)1<<d)+(ll)query(trie[u.ch[!x]],val,d-1,k); return (ll)query(trie[u.ch[x]],val,d-1,k-lsum); } int main(){ trie[0].ch[0]=trie[0].ch[1]=trie[0].sum=0; insert(trie[0],trie[head[0]=++cnt],0,DEP); scanf("%d%d",&N,&M); for(int i=1;i<=N;++i){ ll a; scanf("%lld",&a); s[i]=s[i-1]^a; insert(trie[head[i-1]],trie[head[i]=++cnt],s[i],DEP); q.push((node){query(trie[head[i-1]],s[i],DEP,1),i,1}); } for(int i=1;i<=M;++i){ ans+=q.top().val; int x=q.top().x,k=q.top().k; q.pop(); if(k==x) continue; q.push((node){query(trie[head[x-1]],s[x],DEP,k+1),x,k+1}); } printf("%lld",ans); return 0; }
P5283 [十二省联考2019]异或粽子的更多相关文章
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- Luogu P5283 [十二省联考2019]异或粽子
感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...
- P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...
- 【题解】Luogu P5283 [十二省联考2019]异或粽子
原题传送门 看见一段的异或和不难想到要做异或前缀和\(s\) 我们便将问题转化成:给定\(n\)个数,求异或值最靠前的\(k\)对之和 我们珂以建一个可持久化01trie,这样我们就珂以求出每个值\( ...
- [十二省联考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,和 ...
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
随机推荐
- 「Python」为什么Python里面,整除的结果会是小数?
2018-06-08 参考资料:Python学习笔记(4)负数除法和取模运算 先来看三个式子(!这是在Python3.0下的运算结果): 输出结果: ‘//’明明是整除,为什么结果不是整数,而会出现小 ...
- docker的基本知识
Docker 是什么? Docker 是一个开源的应用容器引擎,是基于go语言的,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...
- emacs常用指令
虽然平时用Dev,但考试的时候linux下没有Dev,只能用emacs了…… 这里记录一些我常用的指令和配置文件中的代码行. 指令: 1.c-x 1:只留一个窗口 2.c-x 2:分成上下两个窗口 3 ...
- P3371 【模板】单源最短路径(弱化版)
// luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<algorithm> ...
- [解读REST] 2.REST用来干什么的?
衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...
- scala的多种集合的使用(1)之集合层级结构与分类
一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...
- 踩坑之mongodb配置文件修改
一.说明 本文档是在mongodb为3.4下编写的,仅作为参考 配置mongodb有两种方式,一种是通过mongod和mongos两个命令:另外一种方式就是配置文件的方式.因为更容易去管理,所以后者更 ...
- MVVM数据代理
MVVM数据代理 function MVVM(options) { this.$options = options || {}; var data = this._data = this.$optio ...
- Jira安装过程
一.下载jira jira下载路径:https://www.atlassian.com/software/jira/download 二.安装 jira安装一直下一步下一步即可 三.破解 E:\JIR ...
- Windows下的命令神器Cmder
1. 下载地址: https://cmder.net/ 建议安装完整版本 2.设置与基本使用 1)将cmder添加到环境变量中PATH 2)添加到右键 Cmder.exe /REGISTER ALL ...