首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
[loj3048]异或粽子
】的更多相关文章
[loj3048]异或粽子
先对其求出前缀异或和,然后$o(k)$次枚举,每次选择最大值,考虑如何维护可以全局开一个堆,维护出每一个点的最大值的最大值,那么相当于要在一个点中删去一个点再找到最大值将这些删去的点重新建成一颗trie树,与所有数构成的trie树减一下,就可以找到新的最大值了,再用堆维护即可有一些细节:1.数值范围较大,需要开long long:2.由于无法判断位置关系,因此要取2k个并将答案除以2 1 #include<bits/stdc++.h> 2 using namespace std; 3 #def…
LOJ3048 「十二省联考 2019」异或粽子
题意 题目描述 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具有一个非负整数的属性值 $a_i$.每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 $k$ 个粽子. 小粽的做法是:选两个整数数 $l$, $r$,满足 $1 \leqslant l \leqslant r \leqslant n$,将编号在 $[l, r…
[十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出与他异或起来最大的左端点并将这组信息用结构体存起来插入堆中. 那么最大值就是堆顶那组(假设右端点为$r$),但考虑到次大值可能出自同一个右端点,所以在弹出堆顶后还需要将以$r$为右端点的次大值插入堆中. 那么如何求出以$r$为右端点的最大值和次大值? 我们对序列每个数为一个版本建可持久化$trie$…
【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如果取了一个数,就把它再在\(Trie\)树上查一次新建一个元素丢回堆里就行了. #include<iostream> #include<cstdio> #include<queue> using namespace std; #define ll long long #de…
[十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和直接sort一样.. 咳咳,官方题解是. 一个堆维护i为终点,可以取得位置为\([L,R]\)的最大值为val. 每次选最大的,然后将这个点分裂成两个: i为终点,可以取得位置为\([L,x-1]\)的最大值为\(val_1\). i为终点,可以取得位置为\([x+1,R]\)的最大值为\(val_2\)…
『异或粽子 堆 可持久化trie』
异或粽子 Description 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n.第 i 种馅儿具有一个非负整数的属性值 ai.每种馅儿的数量都足够多,即小粽不 会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 k 个粽子. 小粽的做法是:选两个整数数 l, r,满足 1 ≤ l ≤ r ≤ n,将编号在[l, r] 范围内的所有 馅儿混合做成一个粽子,所得的粽子的美味度为这些粽子的…
【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制拆分 最高位取一定比前面所有取优 但是呆住了 没有想到是对前缀异或拆分 对于位运算等操作可以考虑 线性基和trie 因为 ai xor aj=aj xor ai 所以吧这种情况算进去就取ans/2 因为 i=j 时异或为0是最小的 不会影响答案 把各个前缀异或插进数组 询问强制以每个点为前面…
洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 n 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 1 到 n.第 ii 种馅儿具有一个非负整数的属性值 a_i.每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 k 个粽子. 小粽的做法是:选两个整数数 l, r,满足 1⩽…
Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). 对于区间异或和,显然可以处理成两个前缀异或和的异或和,然后做法就非常蠢,把所有前缀异或和插入到可持久化01Trie里面,然后求以每个位置为右端点的最大区间前缀和,放入大根堆维护.然后从堆中取\(k\)次最大,每次取完把对应位置的相对当前的次大插入堆中.复杂度\(O(开O2能过)\)qwq.众所周知…
「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题目,非常的相似.[超级钢琴]还有[最小函数值]还有[最大异或和] 感觉这一些题目拼在一起就变成了这一道水题. 首先我们需要预处理出,所有区间的异或最大值. 这个东西可以用可持久化\(01trie\)实现,那么我们思考一下如何实现查询第\(k\)大的值的操作. 以下是关于01字典树中查询第k大的操作的…
并不对劲的loj3048:p5283:[十二省联考]异或粽子
题目大意 有\(n\)(\(n\leq5\times10^5\))个数\(a_1,a_2,...a_n\)(\(a_i\leq 2^{32}-1\)) 求区间异或和前\(k(k\leq2\times10^5)\)大之和 题解 考虑二分,找出第\(k\)大异或和是多少 将每个位置上的数变成前缀异或和\(s_i\)后,建出可持久化trie树,第\(i\)个版本由\(0,s_1,s_2,..,s_i\)组成,trie树上每个点维护这个点的子树中有几个数 二分\(x\),判断是否有不超过\(k\)个异或…
[LOJ3048] [十二省联考2019] 异或粽子
题目链接 LOJ:https://loj.ac/problem/3048 洛谷:https://www.luogu.org/problemnew/show/P5283 Solution 考虑每个子串都是一个前缀的后缀,我们可以用堆维护四元组\((l,r,ed,pos)\)表示当前右端点为\(ed\),左端点范围是\([l,r]\),其中\([pos+1,ed]\)这个区间的异或和最大. 这其实就是固定了前缀来找后缀.那么我们每次可以从堆顶拿一个四元组出来,然后分裂成两个:\((l,pos-1,e…
P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 \(1\) 到 \(n\).第 \(i\) 种馅儿具有一个非负整数的属性值 \(a_i\).每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 \(k\) 个粽子. 小粽的做法是:选两个整数数 \(l\), \(r\),满足 \(1 \leqslant l…
「十二省联考 2019」异或粽子——tire树+堆
题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具有一个非负整数的属性值 $a_i$.每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 $k$ 个粽子. 小粽的做法是:选两个整数数 $l,r$,满足 $1\le l\le r\le n$,将编号在 $[l,r]$ 范围内的所有馅儿混合做成一个粽子,所得的…
[十二省联考2019]D1T1异或粽子
嘟嘟嘟 做这题之前,强烈推荐先把这道题切了P1631序列合并. 这两道题思路基本一模一样. 首先把异或处理成前缀异或,然后维护一个大根堆,每一次取出堆顶加到答案里面,然后把堆顶所在元素的次大的异或值放进堆里.这样循环\(k\)次,就是答案. 关键在于对于数\(sum[i]\),怎么找异或第几大.众人皆知是建01trie,然后在trie上像平衡树找第\(k\)大一样二分就可以了.因为对于每一个\(i\),查找的范围是\(0\) ~ \(i - 1\),建\(n\)棵trie树当然不行,所以我们要建…
Luogu P5283 [十二省联考2019]异或粽子
感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问题显然可以二分第\(k\)大,然后验证有多少个值小于等于它 然后考虑怎么判断,我们建一棵0/1Trie,然后枚举一个右端点,每次把整个Trie异或上这个点的权值 具体实现的话就是不断向下走的过程,当这一位为\(1\)时交换左右子树即可 然后相当于查小于等于一个数的数个数以及和,直接Trie上节点维护…
[十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\(pos\) 我们维护一个小根堆(堆顶最大),权值为st-pos的异或和,每一次找出最大的并删掉 所谓删,就是把一个区间从pos处分裂 即:\((st, l, r)->(st, l, pos - 1) (st, pos + 1, r)\) 这样重新维护pos值即可 维护pos值时,我们需要维护区间内与x的…
luogu5283 异或粽子
题目链接 思路 首先求个前缀异或和,这样就可以\(O(1)\)的得到区间异或和了. 然后发现问题转化为 找出不同的\(k\)个二元组\(x,y\).使得\(a_x \otimes a_y\)的和最大. 有个比较有趣的思路 设\(S_i\)表示前\(i\)个元素的异或和.对于每个\(S_i\),我们找出在\(S\)数组中与他异或起来最大的数字是多少.假设第\(i\)个得到的最大异或和为\(t_i\) 然后从这些数字中找出最大的那个.假设是\(t_x\).然后我们就把答案加上\(t_x\),并且把\…
LOJ#3048. 「十二省联考 2019」异或粽子 Trie
原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案,在Trie树上统计一下答案. 2. 求出前 k 大的和:已经知道了第 k 大的数值,那么,只要再在 Trie 树上走一趟就好了. 这两部分直接暴力都是 $O(n\log^2 a_i)$ 的. 那么我们来稍微优化一下: 对于 1. ,我们改成 Trie 树上二分,变成了 $O(n\log a_i)$…
Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两部分重新扔进堆即可.查询一个值在一个区间中的最大异或和用可持久化trie实现.luogu上T掉了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<…
洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找一个\(sum_j\)使得它和\(sum_{i-1}\)异或最大.可以可持久化Trie. 对\(i\in[1,n]\)都求一遍它能得到的最大的异或值,扔到堆里. 每次从堆里找出值最大的,假设是\(x\),与\(sum_{x-1}\)异或得到最大值的数是\(sum_y\),那么之后就不能选\(sum_…
[十二省联考2019]异或粽子 (可持久化01tire 堆)
/* 查询异或最大值的方法是前缀和一下, 在01trie上二分 那么我们可以对于n个位置每个地方先求出最大的数, 然后把n个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插入到堆中 所以动态维护01trie就可以了 */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define mm…
LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)
题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\),最后答案除以一个\(2\)就可以了.显然\(a_i\oplus a_i=0\),所以并不会影响答案 我们开一个堆,存\((i,k)\)表示对于\(a_i\)来说,第\(k\)大的\(a_i\oplus a_j\)的值,然后每次把\((i,k+1)\)扔进堆里就可以了 //minamoto #incl…
【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)
点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的题目. 其实它的实现与主席树也是类似的. 大致思路 首先,我们统计一遍前缀异或和. 然后,我们根据前缀异或和建一棵可持久化\(Trie\)树. 接下来最核心的来了: 我们先求出以每个点为右端点所能得到的最大异或和,这可以在\(Trie\)树上查询得到(和普通的\(Trie\)树是一样的). 然后,把…
[十二省联考2019] 异或粽子 解题报告 (可持久化Trie+堆)
interlinkage: https://www.luogu.org/problemnew/show/P5283 description: solution: 显然有$O(n^2)$的做法,前缀和优化一下即可 正解做法是先确定一个右端点$r$,找到最优的$l$使得该区间的异或和最大,这个可以用可持久化$Trie$实现.不懂的话可以在我的博客里搜索 对每个点取出来后把答案放进一个堆里,显然当前的堆顶一定会对答案产生贡献 然后我们考虑每次取出的右端点,它依旧可能产生贡献.即上一次取的最优的$l$把…
【题解】Luogu P5283 [十二省联考2019]异或粽子
原题传送门 看见一段的异或和不难想到要做异或前缀和\(s\) 我们便将问题转化成:给定\(n\)个数,求异或值最靠前的\(k\)对之和 我们珂以建一个可持久化01trie,这样我们就珂以求出每个值\(s[a]\)与之前所有的值异或值最大的值\(b\)是多少,把这些所有\((b,a)\)塞进一个堆中 每次从堆顶取元素,设这个元素为\((b,a)\),要将\(b\)加入答案,并且在版本\(a\)的01trie中减去\(s[a]\)^\(b\),再取出\(s[a]\)与01trie中的数异或最大值(原…
BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆
和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) // , freopen(s".out","w",stdout) using namespace std; ch…
BZOJ 5495: [2019省队联测]异或粽子 (trie树)
这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值放入优先队列,然后找最大的一个累计答案后pop掉,假设找到的右端点是r,就把r能异或出来的第二大再加入队列.找k次就行了.这样在trie上找第k大就维护一个size就行了.mdzz这么显然居然没有想出来,还是自己太菜- 签到题没做来- CODE #include <bits/stdc++.h> u…
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]\)区间…
[十二省联考2019] 异或粽子 - 可持久化Trie,堆
求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大. Solution (差点又看错题了) 做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对 建一棵可持久化 0-1 Trie,这样我们就可以 \(O(log n)\) 求出对于某个右端点,它的所有可能答案中,第 \(k\) 大的答案 然后利用堆来维护答案.我们先把对每一个右端点,第 \(1\) 大的答案插入堆.然后循环弹出.每次弹出一个,如果它是 \(u\) 这个右端点对应的第 \(v\) 大的答案,我们…