题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值

最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出意外会被卡..看完题解才恍然大悟

$01Trie$是具有二分性质的!因为每个节点最多有2个儿子!

先对$b$序列建可持久化$01Trie$,记录一个$sum$表示当前节点的子树内有多少个数

对于每次询问,因为$n$很小,暴力枚举$a$进行统计,记录每个a当前在01Trie的位置

接下来就是在$01Trie$上二分了

按位从高到低枚举,统计一共有多少个数这一位是1,即每个a所在$01Trie$位置 和这一位异或值为1 的子树内,记为$tot$

如果$tot>k$,说明这一位不是1,每个$a$分别向异或值是0的地方走,然后$K-=tot$,去掉这一位填1的贡献

反之每个$a$往异或值为1的地方走

最后输出答案即可

#include <set>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 301000
#define N2 10201000
#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;int gint()
{int ret=0,fh=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}return ret*fh;
}uint bin[35];
int n,m;
uint a[N1],b[N1],pa[N1];
int px[N1],py[N1];struct Trie{
int ch[N2][2],num[N2],root[N1],tot;
int sum[N2],stk[N2],tp;
void init()
{root[0]=tot=1;int x=1;for(int i=30;i>=0;i--){ch[x][0]=++tot;x=ch[x][0],num[x]=1;}
}
void insert(int s,int rt1,int rt2,int w)
{int x,y,p;y=root[rt1];x=root[rt2]=++tot;for(int i=31;i>=0;i--){p=(s&bin[i])?1:0;ch[x][p]=++tot;ch[x][p^1]=ch[y][p^1];num[ch[x][p]]=num[ch[y][p]]+w;sum[ch[x][p]]=sum[ch[y][p]];x=ch[x][p],y=ch[y][p];stk[++tp]=x;}sum[x]++,stk[tp--]=0;while(tp){x=stk[tp--];sum[x]=sum[ch[x][0]]+sum[ch[x][1]];}
}
uint query(int L,int R,int l,int r,int K)
{int x,y,p;uint ans=0;y=l<0?0:root[l],x=root[r];int s[2],tot;for(int j=L;j<=R;j++)px[j]=x,py[j]=y;for(int i=31;i>=0;i--){s[0]=0,s[1]=0,tot=0;for(int j=L;j<=R;j++){p=(a[j]&bin[i])?1:0,s[p]++;tot+=sum[ch[px[j]][p^1]]-sum[ch[py[j]][p^1]];}if(K>tot){K-=tot;for(int j=L;j<=R;j++){p=(a[j]&bin[i])?1:0;if(num[ch[px[j]][p]]-num[ch[py[j]][p]]>0)px[j]=ch[px[j]][p],py[j]=ch[py[j]][p];else px[j]=py[j]=0;}}else{for(int j=L;j<=R;j++){p=(a[j]&bin[i])?1:0;if(num[ch[px[j]][p^1]]-num[ch[py[j]][p^1]]>0)px[j]=ch[px[j]][p^1],py[j]=ch[py[j]][p^1];else px[j]=py[j]=0;}ans|=bin[i];}}return ans;
}
}T;int main()
{//freopen("t1.in","r",stdin);scanf("%d%d",&n,&m);for(int i=31;i>=0;i--)bin[i]=(1<<i);for(int i=1;i<=n;i++)a[i]=gint();T.init();for(int i=1;i<=m;i++)b[i]=gint(),T.insert(b[i],i-1,i,1);int Q,u,d,l,r,K;scanf("%d",&Q);for(int q=1;q<=Q;q++){u=gint(),d=gint(),l=gint(),r=gint(),K=gint();printf("%d\n",T.query(u,d,l-1,r,K));}return 0;
}

转载于:https://www.cnblogs.com/guapisolo/p/10031560.html

BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)相关推荐

  1. 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie

    我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...

  2. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 474  Solved: 258 D ...

  3. 不占用多余空间实现值的交换——异或运算

    首先什么是异或运算? ^规则: 0 ^ x = x x ^ x = 0 那么 a 与 b 交换值如何做呢???三行代码

  4. C 关于使用异或运算操作概述

    对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作. 异或运算可以达到交换两数的目的,代码如下: void swap(int &am ...

  5. 训练三层BP神经网络实现异或运算 Python 代码实现

    本文主要使用下面的网络结构来完成 异或运算 异或运算 : 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0 . 上图的公式推导可以参考博文: 三层神经网络前向后向传播示意图 imp ...

  6. 大脑只需单个神经元就可进行XOR异或运算,Science新研究揭开冰山一角,引发热议...

    边策 赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在机器学习中,异或(XOR)这样的非线性问题一直需要多层神经网络来解决.科学家一直以为,即使在人类大脑中,XOR运算也需要多层神经元网 ...

  7. 尼姆博奕 (Nimm Game) 异或运算;

    讲到博弈,不得不讲异或运算, 我真服了 大神了, 怎么会将博弈和二进制联系到一起,  大写的服! 异或运算 ^    原理就是  二进制形式,对于相应的每一位  相同 为0 不同为1 ; 简单理解就是 ...

  8. 关于一些运算((与运算)、|(或运算)、^(异或运算)........)的本质理解【转】...

    看到一篇博客,关于一些运算的解析,觉得有用,怕以后找不着,直接复制下来,以备以后学习用 原文链接:https://blog.csdn.net/xiaopihaierletian/article/det ...

  9. FEC之异或运算应用

    话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a ...

最新文章

  1. 第七讲:数据契约(2)
  2. SQL中object_id函数的用法
  3. Show Attend and Tell的实现代码中的python知识学习
  4. Myeclipse学习总结(2)——MyEclipse快捷键大全
  5. yum,yum指向,yum源创建
  6. maven-dependency-plugin (goals copy-dependencies, unpack) is not support解决办法
  7. 洛谷 P3049园林绿化 题解
  8. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
  9. javascript 字符串和json的互转
  10. 溢出的文字如何省略号显示
  11. SecureCRT复制粘贴快捷设置
  12. 恶意样本分析手册——理论篇
  13. 河北农业大学能不能学计算机,河北农业大学(专业学位)计算机技术考研难吗
  14. JS-移除class
  15. (转载)JS与WebView交互存在的一些问题
  16. 老牌破解神器L0phtCrack强势回归 口令破解速度提升500倍
  17. 标签管理系统Bartender 2022新版前瞻:企业用户随时随地标签打印变得更容易
  18. 10余年软件开发与系统架构经验,一起聊聊软件开发技术、系统架构技术、以及程序员最真实可行的职场打怪技能,代码之外的生存软技能。
  19. intrins.h文件解读
  20. SCI/EI/ISTP论文收录索引号的查询方法

热门文章

  1. [原创] GUI原理2 - 矢量线条
  2. 微信小程序开发实战(二)UI组件介绍 Vant Weapp
  3. C语言 显示对象地址
  4. [AI开发]目标跟踪之行为分析
  5. VC实现将对话框最小化到系统托盘
  6. 计算机网络(谢希仁版)——第四章回顾(2)
  7. 洛谷——P2708 硬币翻转
  8. H5学习之旅-H5的样式(5)
  9. cookie完全跨域
  10. jQuery学习入门总结之css()和addClass()的不同