【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)
大致题意: 求前\(k\)大的区间异或和之和。
可持久化\(Trie\)树
之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树。
终于,碰到一道真·可持久化\(Trie\)树的题目。
其实它的实现与主席树也是类似的。
大致思路
首先,我们统计一遍前缀异或和。
然后,我们根据前缀异或和建一棵可持久化\(Trie\)树。
接下来最核心的来了:
我们先求出以每个点为右端点所能得到的最大异或和,这可以在\(Trie\)树上查询得到(和普通的\(Trie\)树是一样的)。
然后,把这些值连同该右端点全扔入大根堆里。
每次,我们取出堆顶,统计答案后求出以该点为右端点所能得到的次大值,然后重新扔入堆里。如果再取到该右端点,就是次次大值、次次次大值,以此类推。
那么如何求次大值呢?
没关系,反正我们本来就是可持久化\(Trie\)树,直接复制该点的\(Trie\)树并将求出的最大值所对应的数在树上删去即可。
这种方法的复杂度应该是\(O((n+k)log\ Max\ a_i)\),但我写得弱了一点,变成了\(O((2n+k)log\ Max\ a_i)\)。虽然很好改,但我懒得改了。。。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define RU Reg unsigned
#define Con const
#define CI Con int&
#define CU Con unsigned&
#define I inline
#define W while
#define N 500000
#define K 200000
#define mp make_pair
#define fir first
#define sec second
using namespace std;
int n,k,p[N+5];unsigned a[N+5];typedef pair<unsigned,int> Pr;
priority_queue<Pr> q;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
#undef D
}F;
class PersistentTrie//可持久化Trie树
{
private:
#define SZ ((N<<1)+K+1)
#define Log 33
int tot,Rt[N+5];struct node {int Sz,S[2];}O[SZ*Log+5];
I void upt(int& rt1,RI rt2,CU x,CI t,CI D)//修改
{
if((O[rt1=++tot]=O[rt2]).Sz+=t,!~D) return;//复制节点,更新size
RI d=(x>>D)&1;upt(O[rt1].S[d],O[rt2].S[d],x,t,D-1);//处理子节点
}
I unsigned qry(int& rt,CI x,CI D)//询问与x的最大异或和
{
if(!~D) return 0;RI d=(x>>D)&1;
return O[O[rt].S[d^1]].Sz?qry(O[rt].S[d^1],x,D-1)|(1<<D):qry(O[rt].S[d],x,D-1);//能使这一位为1就必使其为1,否则使其为0
}
public:
I PersistentTrie() {tot=1,Update(0,0,0,1);}
I void Update(CI v1,CI v2,CU x,CI t) {upt(Rt[v1],Rt[v2],x,t,31);}
I unsigned Query(CI v) {RU t=qry(Rt[v],a[v],31);return Update(v,v,a[v]^t,-1),t;}//询问,为避免计算多次贡献将其删去
}P;
int main()
{
RI i;Pr t;Reg long long ans=0;
for(F.read(n,k),i=1;i<=n;++i) F.read(a[p[i]=i]),a[i]^=a[i-1],P.Update(i,i-1,a[i],1);//初始化建树
for(i=1;i<=n;++i) q.push(mp(P.Query(i),i));//询问然后扔入堆中
for(i=1;i<=k;++i) t=q.top(),q.pop(),ans+=t.fir,//取出堆顶,统计答案
--p[t.sec]&&(q.push(mp(P.Query(t.sec),t.sec)),0);//将次大值扔入堆中
return printf("%lld",ans),0;//输出答案
}
【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)的更多相关文章
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- [十二省联考2019] 异或粽子 - 可持久化Trie,堆
求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大. Solution (差点又看错题了) 做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对 建一棵可持久化 ...
- P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- [十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie 链接 luogu 思路 首先求前k大的(xo[i]^xo[j])(i<j). 考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)
LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
随机推荐
- PIE SDK常用滤波
1. 算法功能简介 空间域滤波实在图像空间( x. y)对输入图像应用滤波函数(核.模板)来改进输出图像的处理方法,主要包括平滑和锐化处理,强调像素与其周围相邻像素的关系,常用的方法是卷积运算. 空间 ...
- Eclipse/Myeclipse/Scala IDEA for Eclipse里两种添加插件的方法(在线和离线)
不多说,直接上干货! 方法1:在线安装 第一步,在eclipse菜单栏下,选中help ---->Install New Software 第二步,点击图中 add 添加软件下载地址 第三步 , ...
- RefulApi自动化测试~Hitchhiker的部署
Hitchhiker是一个在github上开源的项目,被善友大哥收录到了它的微服务工具包里<开源的 Restful Api 集成测试工具 Hitchhiker>,同时源代码也开源到了git ...
- Linux getopt()函数 getopt_long()函数---转
http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...
- 【Linux相识相知】bash的特性
命令历史 shell进程会记录用户提交执行过的命令 可以是用history查看: [root@localhost dev]# history ss -tnl ifconfig vi /etc/sysc ...
- bzoj 5298: [Cqoi2018]交错序列
Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对 ...
- js面向对象3
1.this的使用 核心:在js中,this表示当前对象,“谁”调用了当前函数,“this”就指向了“谁” 语法: Function 类(){ this.属性=值; } 例1.在构造器中,使用this ...
- jQuery获取table表中的td标签
首先我来介绍一下我遇到的问题 1.当有一个table表包含了<tr>标签,<td>标签,大致可以认为是这样的: <tr> <td> @scene.ID ...
- UDP client,UDP server, TCP server, TCP client
UDP server import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocke ...
- jq on方法绑定多个事件
一.jquery为多个选择器绑定同一个事件 $("#start,#end").on("click",function(){ alert("The pa ...