bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】
和bzoj4504差不多,就是换了个数据结构
像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上
关于怎么快速求区间和,用一个可持久trie上维护最大xor值和对应的点即可
#include<iostream>
#include<cstdio>
#include<queue>
//#include<ctime>
using namespace std;
const int N=500005;
int n,m,rt[N],tot;
unsigned int a[N],s[N],b[35];
long long ans;
struct trie
{
int c[2],s,p;
}t[20000005];
struct qwe
{
int d,l,r,p;
unsigned int v;
qwe(int D=0,int L=0,int R=0,int P=0,unsigned int V=0)
{
d=D,l=L,r=R,p=P,v=V;
}
bool operator < (const qwe &a) const
{
return v<a.v;
}
};
priority_queue<qwe>q;
long long read()
{
long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void ins(int &ro,int la,int w,int id)
{
ro=++tot;
t[ro]=t[la];
t[ro].s++;
if(w==-1)
{
t[ro].p=id;
return;
}
bool p=(s[id]&b[w]);//cerr<<w<<" "<<p<<endl;
ins(t[ro].c[p],t[la].c[p],w-1,id);
}
pair<int,unsigned int>ques(int la,int ro,int id,int w,unsigned int v)
{//cerr<<t[ro].s-t[la].s<<endl;
if(w==-1)
return make_pair(t[ro].p,v);
bool p=(s[id]&b[w]);//cerr<<w<<" "<<p<<" "<<t[t[ro].c[p^1]].s<<" "<<t[t[la].c[p^1]].s<<endl;
if(t[t[ro].c[p^1]].s-t[t[la].c[p^1]].s>0)
return ques(t[la].c[p^1],t[ro].c[p^1],id,w-1,v|b[w]);
else
return ques(t[la].c[p],t[ro].c[p],id,w-1,v);
}
int main()
{
// freopen("xor.in","r",stdin);
// freopen("xor.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
b[0]=1;
for(int i=1;i<=31;i++)
b[i]=(b[i-1]<<1);
for(int i=n;i>=1;i--)
s[i]=s[i+1]^a[i];
rt[0]=++tot;
for(int i=1;i<=n;i++)
ins(rt[i],rt[i-1],31,i);//cerr<<"OK"<<endl;
for(int i=1;i<=n;i++)
{
pair<int,unsigned int>nw=ques(rt[0],rt[i],i+1,31,0);
q.push(qwe(i,1,i,nw.first,nw.second));
}
while(m--)
{
qwe u=q.top();//cerr<<u.v<<endl;
q.pop();
ans+=u.v;
if(u.l<=u.p-1)
{
pair<int,unsigned int>nw=ques(rt[u.l-1],rt[u.p-1],u.d+1,31,0);
q.push(qwe(u.d,u.l,u.p-1,nw.first,nw.second));
}
if(u.p+1<=u.r)
{
pair<int,unsigned int>nw=ques(rt[u.p],rt[u.r],u.d+1,31,0);
q.push(qwe(u.d,u.p+1,u.r,nw.first,nw.second));
}
}//cerr<<clock()<<endl;
printf("%lld\n",ans);
return 0;
}
bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】的更多相关文章
- BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆
和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #defi ...
- BZOJ 5495: [2019省队联测]异或粽子 (trie树)
这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- bzoj 5499: [2019省队联测]春节十二响【堆】
首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 #include<iostream& ...
- bzoj 5498: [2019省队联测]皮配【dp】
是个神仙dp-- 参考:https://www.luogu.org/blog/xzz-233/solution-p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限 ...
- bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】
有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...
- BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)
题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...
随机推荐
- window.onresize 事件笔记
1.浏览器尺寸变化响应事件 : window.onresize = function(){....} 这里须要注意的是,onresize响应事件处理中.获取到的页面尺寸參数是变更后的參数. // ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- app具体介绍界面-01
在我们的上一篇博客中,我们介绍了首页中的app列表界面怎样完毕.这个ListView以及其Adapter会在我们后面的界面中重用,所以这个是比較重要的,在这一篇博客中,我们先完毕app具体介绍界面的一 ...
- c程序设计语言第一章1
1,c程序都是由函数和变量组成的. 练习1.6验证布尔表达式getchar()!= EOF的取值是0还是1 答: #include <stdio.h> #include <stdli ...
- mybatis一对多
mapper.xml <mapper namespace="com.oracle.dao.one2manyDao"> <resultMap type=" ...
- android 项目R文件丢失解决的方法
R文件丢失的原因有非常多,这里提供几种解决的方法: 1. 选中项目,点击 Project - Clean , 清理一下项目. 2. 选中项目,右键 选择 Android Tools - Fix P ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- JAVA BigDecimal 高精度运算
文章参考一位博友,由于时间太久忘了链接,见谅! public class BigDecimalUtils { private static final int DIV_SCALE = 10;// 除法 ...
- ViewGroup如何分发事件
dispatchTouchEvent事件派发显示隧道方式.再是冒泡方式隧道方式传递,直道某一个元素消耗此事件,由上至下逐层分发视图.冒泡方式传递,当某个视图消耗事件后其return boolean 是 ...
- 经常使用 Java API
经常使用Java API 一. java.io.BufferedReader类(用于从文件里读入一段字符.所属套件:java.io) 1. 构造函数BufferedReader(java.io.Fil ...