[十二省联考2019] 异或粽子 - 可持久化Trie,堆
求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大。
Solution
(差点又看错题了)
做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对
建一棵可持久化 0-1 Trie,这样我们就可以 \(O(log n)\) 求出对于某个右端点,它的所有可能答案中,第 \(k\) 大的答案
然后利用堆来维护答案。我们先把对每一个右端点,第 \(1\) 大的答案插入堆。然后循环弹出。每次弹出一个,如果它是 \(u\) 这个右端点对应的第 \(v\) 大的答案,我们就计算出 \(u\) 这个右端点对应的第 \(v+1\) 大的答案(如果存在的话)并且把它插入堆,然后继续。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
namespace trie {
    int ind,ch[N*40][2],siz[N*40],root[N*40];
    void insert(int id,int x) {
        root[id]=++ind;
        ch[ind][0]=ch[root[id-1]][0];
        ch[ind][1]=ch[root[id-1]][1];
        siz[ind]=siz[root[id-1]]+1;
        int p=ind;
        for(int i=39;i>=0;--i) {
            int t=(x>>i)&1;
            ++ind;
            ch[ind][0]=ch[ch[p][t]][0];
            ch[ind][1]=ch[ch[p][t]][1];
            siz[ind]=siz[ch[p][t]]+1;
            ch[p][t]=ind;
            p=ind;
        }
    }
    int query(int id,int x,int k) {
        int p=root[id],ans=0;
        for(int i=39;i>=0;--i) {
            int t=(x>>i)&1;
            if(siz[ch[p][t^1]]>=k) {
                p=ch[p][t^1];
                ans|=1ll<<i;
            }
            else {
                k-=siz[ch[p][t^1]];
                p=ch[p][t];
            }
        }
        return ans;
    }
}
struct pii {
    int a,b,c;
    bool operator < (const pii &x) const {
        return a < x.a;
    }
};
priority_queue <pii> q;
int n,k,a[N],ans;
signed main() {
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++) {
        scanf("%lld",&a[i]);
        a[i]^=a[i-1];
    }
    for(int i=0;i<=n;i++) {
        trie::insert(i,a[i]);
    }
    for(int i=1;i<=n;i++) {
        q.push((pii){trie::query(i-1,a[i],1),i,1});
        //cout<<trie::query(i-1,a[i],1)<<" ";
    }
    //cout<<endl;
    for(int i=1;i<=k;i++) {
        int val=q.top().a,pos=q.top().b,idx=q.top().c;
        ans+=val;
        //cout<<val<<endl;
        q.pop();
        if(idx<pos) {
            q.push((pii){trie::query(pos-1,a[pos],idx+1),pos,idx+1});
        }
    }
    cout<<ans;
}
												
											[十二省联考2019] 异或粽子 - 可持久化Trie,堆的更多相关文章
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
		
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
 - [十二省联考2019]异或粽子——可持久化trie树+堆
		
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$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: 考试时想到了前缀异或 想到了对每个数按二进制 ...
 - [十二省联考2019]异或粽子(堆+可持久化Trie)
		
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
 - Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
		
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
 - Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
		
做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...
 
随机推荐
- Android Intent用法总结
			
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...
 - HUE下载HDFS文件时报ERR_CONNECTION_TIMED_OUT错误的解决办法
			
1.故障描述 这是运行在公有云上的一套Hadoop集群,有一个公网IP将部分服务的端口映射出来供办公室访问. 数据分析师报告说:在HUE上面浏览HDFS文件,点击"download" ...
 - xcode 11.3 发布ipa采坑记录
			
为了适配ios13,特意更新了xcode11.3 .更新完后发现 application loader没有了,然后蒙了. 然后网上一顿搜索,归纳出了三种上传方式: 一.altool 使用xcode中的 ...
 - Openshift部署流程介绍
			
背景 Openshift是一个开源容器云平台,是一个基于主流的容器技术Docker和Kubernetes构建的云平台.Openshift底层以Docker作为容器引擎驱动,以Kubernetes 作为 ...
 - day 8 函数编程_byets
			
定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' #b开头的都代表是bytes ...
 - java设计模式学习笔记--浅谈设计模式
			
设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...
 - css的网页布局案例
			
常见行布局: 导航使用position:fixed固定住 导航会脱离文档流,不占据空间 导致下面的元素上移,因此需要将下面的元素的padding-top设置成导航的高度 <!DOCTYPE ht ...
 - 覆盖的面积 HDU - 1255 线段树+扫描线+离散化  求特定交叉面积
			
#include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...
 - 吴裕雄--天生自然 python开发学习笔记:Git安装配置流程
 - Linux 下安装 java
			
yum 安装java 配置环境 /etc/profile export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7. ...