BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$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+二分)相关推荐
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
我们观察数据:树套树 PASS 主席树 PASS 一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...
- 【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 ...
- 不占用多余空间实现值的交换——异或运算
首先什么是异或运算? ^规则: 0 ^ x = x x ^ x = 0 那么 a 与 b 交换值如何做呢???三行代码
- C 关于使用异或运算操作概述
对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作. 异或运算可以达到交换两数的目的,代码如下: void swap(int &am ...
- 训练三层BP神经网络实现异或运算 Python 代码实现
本文主要使用下面的网络结构来完成 异或运算 异或运算 : 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0 . 上图的公式推导可以参考博文: 三层神经网络前向后向传播示意图 imp ...
- 大脑只需单个神经元就可进行XOR异或运算,Science新研究揭开冰山一角,引发热议...
边策 赖可 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在机器学习中,异或(XOR)这样的非线性问题一直需要多层神经网络来解决.科学家一直以为,即使在人类大脑中,XOR运算也需要多层神经元网 ...
- 尼姆博奕 (Nimm Game) 异或运算;
讲到博弈,不得不讲异或运算, 我真服了 大神了, 怎么会将博弈和二进制联系到一起, 大写的服! 异或运算 ^ 原理就是 二进制形式,对于相应的每一位 相同 为0 不同为1 ; 简单理解就是 ...
- 关于一些运算((与运算)、|(或运算)、^(异或运算)........)的本质理解【转】...
看到一篇博客,关于一些运算的解析,觉得有用,怕以后找不着,直接复制下来,以备以后学习用 原文链接:https://blog.csdn.net/xiaopihaierletian/article/det ...
- FEC之异或运算应用
话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a ...
最新文章
- 第七讲:数据契约(2)
- SQL中object_id函数的用法
- Show Attend and Tell的实现代码中的python知识学习
- Myeclipse学习总结(2)——MyEclipse快捷键大全
- yum,yum指向,yum源创建
- maven-dependency-plugin (goals copy-dependencies, unpack) is not support解决办法
- 洛谷 P3049园林绿化 题解
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
- javascript 字符串和json的互转
- 溢出的文字如何省略号显示
- SecureCRT复制粘贴快捷设置
- 恶意样本分析手册——理论篇
- 河北农业大学能不能学计算机,河北农业大学(专业学位)计算机技术考研难吗
- JS-移除class
- (转载)JS与WebView交互存在的一些问题
- 老牌破解神器L0phtCrack强势回归 口令破解速度提升500倍
- 标签管理系统Bartender 2022新版前瞻:企业用户随时随地标签打印变得更容易
- 10余年软件开发与系统架构经验,一起聊聊软件开发技术、系统架构技术、以及程序员最真实可行的职场打怪技能,代码之外的生存软技能。
- intrins.h文件解读
- SCI/EI/ISTP论文收录索引号的查询方法