和超级钢琴,异或之三倍经验 $?$

堆+贪心素质三连 $?$

好无聊......

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;
char buf[100000],*p1,*p2;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
ll rd()
{
ll x=0; char s=nc();
while(s<'0') s=nc();
while(s>='0') x=(ll)(((x<<2)+x)<<1)+s-'0',s=nc();
return x;
}
namespace trie
{
int tot;
int cnt[N*42],ch[N*42][2];
int newnode() { return ++tot; }
void Insert(int pre,int &x,ll v)
{
int now=x=newnode(),i;
for(i=40;i>=0;--i)
{
int o=(1ll*(v>>i)&1);
ch[now][o^1]=ch[pre][o^1];
ch[now][o]=newnode();
pre=ch[pre][o];
now=ch[now][o];
cnt[now]=cnt[pre]+1;
}
}
ll query(int x,int y,ll z)
{
ll re=0;
int i;
for(i=40;i>=0;--i)
{
int o=(1ll*(z>>i)&1);
if(ch[x][o^1]<ch[y][o^1]) re+=(1ll<<i),x=ch[x][o^1],y=ch[y][o^1];
else x=ch[x][o],y=ch[y][o];
}
return re;
}
};
struct node
{
int o,l,r;
ll val;
int pos;
node(int a=0,int b=0,int c=0,ll d=0,int e=0):o(a),l(b),r(c),val(d),pos(e){}
bool operator<(node b) const
{
return b.val>val;
}
};
priority_queue<node>q;
ll A[N],ar[N],id[N];
int rt[N];
set<int>S[N];
set<int>::iterator it;
int main()
{
// setIO("input");
int i,j,n,k,ou=0;
n=rd(),k=rd();
for(i=1;i<=n;++i)
{
A[i]=rd()^A[i-1];
id[i]=ar[i]=A[i];
trie::Insert(rt[i-1],rt[i],A[i]);
}
sort(ar+1,ar+1+n);
for(i=1;i<=n;++i) id[i]=lower_bound(ar+1,ar+1+n,id[i])-ar;
for(i=1;i<=n;++i) S[(int)id[i]].insert(i);
for(i=0;i<n;++i)
{
int l=i+1,r=n;
ll tmp=trie::query(rt[l-1],rt[r],A[i]);
int idx=lower_bound(ar+1,ar+1+n,A[i]^tmp)-ar;
int pos=*S[idx].lower_bound(l);
q.push(node(i,l,r,tmp,pos));
}
ll ans=0ll;
while(ou<k)
{
node e=q.top(); q.pop();
ans+=(ll)e.val,++ou;
int pos=e.pos;
if(pos!=e.l)
{
ll tmp=trie::query(rt[e.l-1],rt[pos-1],A[e.o]);
int idx=lower_bound(ar+1,ar+1+n,A[e.o]^tmp)-ar;
int t=*S[idx].lower_bound(e.l);
q.push(node(e.o,e.l,pos-1,tmp,t));
}
if(pos!=e.r)
{
ll tmp=trie::query(rt[pos],rt[e.r],A[e.o]);
int idx=lower_bound(ar+1,ar+1+n,A[e.o]^tmp)-ar;
int t=*S[idx].lower_bound(pos+1);
q.push(node(e.o,pos+1,e.r,tmp,t));
}
}
printf("%lld\n",ans);
return 0;
}

  

BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆的更多相关文章

  1. BZOJ 5495: [2019省队联测]异或粽子 (trie树)

    这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值 ...

  2. bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】

    和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么 ...

  3. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)

    LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...

  4. [十二省联考2019] 异或粽子 - 可持久化Trie,堆

    求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大. Solution (差点又看错题了) 做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对 建一棵可持久化 ...

  5. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  6. bzoj 5499: [2019省队联测]春节十二响【堆】

    首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 #include<iostream& ...

  7. bzoj 5498: [2019省队联测]皮配【dp】

    是个神仙dp-- 参考:https://www.luogu.org/blog/xzz-233/solution-p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限 ...

  8. bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】

    有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...

  9. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

随机推荐

  1. LeetCode 1253. 重构 2 行二进制矩阵 - Java - 统计

    题目链接:https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/ ...

  2. golang module 下载外网资源失败解决办法

    用 golang 1.11 module 特性时,需要下载golang.org等外网地址的库文件 可以创建环境变量GOPROXY,使用Aliyun的镜像 go公共代理文档 简介 go module公共 ...

  3. Go基础编程实践(五)—— 错误和日志

    自定义错误类型 Go中可以使用errors.New()创建错误信息,也可以通过创建自定义错误类型来满足需求.error是一个接口类型,所有实现该接口的类型都可以当作一个错误类型. // error类型 ...

  4. K8s-yaml的使用及命令

    YAML配置文件管理对象 对象管理: # 创建deployment资源 kubectl create -f nginx-deployment.yaml # 查看deployment kubectl g ...

  5. ubuntu 安装Jenkins

    一.介绍 Jenkins是一款开源自动化服务器,旨在自动化连续集成和交付软件所涉及的重复技术任务. Jenkins是基于Java的,可以从Ubuntu软件包安装,也可以通过下载和运行其Web应用程序A ...

  6. JZOJ5833 永恒

    题目大意 给你一个树,每个节点上有有一个部落,以及部落的人数,要你求出每个节点的子树里面人数最多的部落是哪一个(人数相同部落编号最小的). 思路 全网第一篇分治题解 考虑树的dfs序,然后分治处理,每 ...

  7. 阿里巴巴 Java 开发手册 (十二)安全规约

    1. [强制]隶属于用户个人的页面或者功能必须进行权限控制校验. 说明:防止没有做水平权限校验就可随意访问.修改.删除别人的数据,比如查看他人的私信 内容.修改他人的订单. 2. [强制]用户敏感数据 ...

  8. 一个超实用的python爬虫功能使用 requests BeautifulSoup

    一个简单的数据爬取的示例 import os,re import requests import random import time from bs4 import BeautifulSoup us ...

  9. 如何使用Git 优雅的版本回退呢?

    在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验).这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措.而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行 ...

  10. pandas-06 Series和Dataframe的排序操作

    pandas-06 Series和Dataframe的排序操作 对pandas中的Series和Dataframe进行排序,主要使用sort_values()和sort_index(). DataFr ...