BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值
先建出来可持久化$01Trie$
用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;aj$的值,堆中按异或值从小到大排序
每次取出一对$<i,j>$并把它从堆中删除
在$[0,j-1]$的 可持久化$01Trie$ 中把$a_{i}$这个数删除
再查询$[0,j-1]$中和$a_{j}$的异或最大值,重新推入堆中...
反复操作$K$次即可
删除操作中的细节比较多
#include <set>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 351000
#define N2 13000000
#define MM 100
#define ll long long
#define dd double
#define uint unsigned int
#define mod 1000000007
#define idx(X) (X-'a')
#define it multiset<node>::iterator
using namespace std; uint bin[];
struct Trie{
int ch[N2][],num[N2],root[N1],tot;
void init()
{
root[]=tot=;int x=;
for(int i=;i>=;i--){
ch[x][]=++tot;
x=ch[x][],num[x]=;
}
}
void insert(uint s,int rt1,int rt2,int w)
{
int x,y,p;
y=root[rt1];
x=root[rt2]=++tot;
for(int i=;i>=;i--)
{
p=(s&bin[i])?:;
ch[x][p]=++tot;
ch[x][p^]=ch[y][p^];
num[ch[x][p]]=num[ch[y][p]]+w;
x=ch[x][p],y=ch[y][p];
}
}
uint query(uint s,int l,int r)
{
int x,y,p;uint ans=;
x=root[r],y=l<?:root[l];
for(int i=;i>=;i--)
{
p=(s&bin[i])?:;
if(num[ch[x][p]]-num[ch[y][p]]>){
x=ch[x][p],y=ch[y][p];
}else if(num[ch[x][p^]]-num[ch[y][p^]]>){
x=ch[x][p^],y=ch[y][p^];
ans|=bin[i];
}else break;
}return ans;
}
}T; int n,K;
int a[N1],res[N1];
struct node{
int id;uint val;
friend bool operator < (const node &s1,const node &s2){
if(s1.val!=s2.val)
return s1.val<s2.val;
else
return s1.id<s2.id;
}
node(int id,uint val):id(id),val(val){}
node(){}
};
multiset<node>s; int main()
{
//freopen("t1.in","r",stdin);
scanf("%d%d",&n,&K);
for(int i=;i<=;i++)
bin[i]=(<<i);
T.init();uint x;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
T.insert(a[i],i-,i,);
}
for(int i=;i<=n;i++){
x=T.query(a[i],,i-);
s.insert(node(i,x));
res[i]=i-;
}
node p;int i,w;
for(int k=;k<=K;k++){
it t=s.begin();
w=(*t).val,i=(*t).id;
printf("%u\n",w);
T.insert(w^a[i],i-,i-,-);
w=T.query(a[i],,i-);
s.erase(t++);res[i]--;
if(res[i]) s.insert(node(i,w));
}
return ;
}
BZOJ 3689 异或之 (可持久化01Trie+堆)的更多相关文章
- BZOJ 3689: 异或之 可持久化trie+堆
和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...
- BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树
$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...
- bzoj 4103: 异或运算 可持久化Trie
题目大意: 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值\(A_{ij} = x_i \text{ xor } y_j ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
我们观察数据:树套树 PASS 主席树 PASS 一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...
- 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key 2 秒 262,144 KB 160 分 6 级题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...
- BZOJ 3689: 异或之
字典树可以$o(logn)查找第k大$ 使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$ 总的时间复杂度为$O(kl ...
随机推荐
- ZBrush软件如何编辑物体
新手在刚接触ZBrush®的时候,想要选中模型进行编辑,有时怎么都选不中,当再次画的时候只能在边上新建一个,还是不能进行编辑,遇到类似问题,你是如何解决的,本文将为您讲解ZBrush中怎么选中物体并进 ...
- 测试用html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- vue 移动端项目,动态控制div距离底部的距离
<template> <div class="details"> <com-nav-bar title="保险详情"> &l ...
- jQuery优化性能的十种方法
1,总是从ID选择器开始继承 例如: <div id="content"> <form method="post" action=" ...
- SPOJ CIRU
SPOJ CIRU 题意 给出n个圆,求他们覆盖的面积. 解法 自适应Simpson,但需要将圆离散化一下,以保证我们查询的是一个连续的有圆的区间. 奇怪的是我没有离散化,样例都没有过,却把题给A了 ...
- S3C6410 LCD Overlay Test Program
测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作.内核选项的Windows至少要为2. 具体支持如下操作:1 ...
- 页面关闭或刷新时触发javascript的事件
当页面在关闭或刷新时提示 window.onbeforeunload(function(){ //判断是关闭还是刷新 1.满足关闭,否则是刷新 if(event.clientX>document ...
- Tarjan缩点【模板】
#include <algorithm> #include <cstdio> #include <map> using namespace std; ); map& ...
- HDU 4313 Contest 2
很明显的树形DP了.但网上有的说可以用并查集.... 考虑一棵子树,当根结点有机器人时,则必定所有子树都要和根结点断开,而根结点向上返回的路径值则为其父结点与根结点连边的权值. 当根结点安全时,假设其 ...
- c++友元实现操作符重载
运算符重载的本质是一个函数 #include <iostream> using namespace std; class A { private: int m_a; int m_b; fr ...