求集合中选一个数与当前值进行位运算的max
求集合中选一个数与当前值进行位运算的max
这是一个听来的神仙东西。
先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦。
我们先看看如果暴力求怎么做,位运算需要给定\(01/10,00,11\)的关系,总共\(8\)种。
如果是暴力的话,我们的方法有两种,
第一种是比较喜闻乐见的,
我们对于当前数\(x\),暴力计算所有存在的数\(a_i\)中,\(x\oplus a_i\)的最大值,这样的复杂度是\(O(2^{16})\)的。
另外一种也是不难考虑到的,
我们对于每个可能出现的数维护一个当前所有数的最大值。
也就是对于所有值域中的数,维护一个答案\(ans\)
然后依次插入所有集合中所有的数\(a_i\),每次暴力计算所有的答案的最大值,
也就是\(ans[x]=max\{x\oplus a_i \}\),这样子询问的时候可以\(O(1)\)查询。
两种方法一种是插入\(O(1)\)询问\(O(n)\),另外一个是插入\(O(n)\),询问\(O(1)\)
我们把两种东西结合一下,这样可以得到一个\(O(\sqrt n)\)的方法。
大致的方法如下:
我们对于每个数从中间分开,拆成前\(8\)个二进制位和后\(8\)个二进制位。
这样子我们可以预处理一个数组\(pre[i][j]\),
表示集合中一个前\(8\)位是\(i\)的数,后\(8\)位能够和\(j\)进行位运算的最大值。
这样子\(i,j\)都是一个\(8\)位的数,总的空间和上述方法一样。
因为位运算是可以按位贪心的,所以对于查询一个数\(x\)
我们把它拆成\(x=a\times 2^8+b\),
每次先暴力\(for\)所有可能的前\(8\)位,找到与\(a\)能够构成最大值的那些数,
然后对于找到的所有数的前八位\(p\),直接查\(pre[p][b]\),
因为前八位更大的数一定更大,那么影响结果的就只剩下后八位了,
把两个部分拼接起来就好了。
这样子暴力\(for\)前八位的复杂度是\(O(2^8)\)
查找后面部分最大值的复杂度是\(O(1)\)
所以这样子总的复杂度\(O(2^8)\)。
而对于集合中插入一个数,前\(8\)位唯一确定,每次只需要预处理后\(8\)位的结果。
时间复杂度还是\(O(2^8)\)
总的复杂度还是\(O(2^8)\)
求集合中选一个数与当前值进行位运算的max的更多相关文章
- HDU 5735 Born Slippy(拆值DP+位运算)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5735 [题目大意] 给出一棵树,树上每个节点都有一个权值w,w不超过216,树的根为1,从一个点往 ...
- 趣题: 按二进制中1的个数枚举1~2^n (位运算技巧)
; ; k <= n; k++){ << k)-,u = << n; s < u;){ ;i < n;i++) printf(-i)&); print ...
- Hash值和位运算
一.Hash 1.md5是hash算法,不可逆,还原的是暴力穷举的方式解析的:加盐之后穷举也不能还原: 2.压缩映射会有重复,即哈希冲突: 二.ConcurrentHashMap 1.putIfAbs ...
- hdu 1856 求集合里元素的个数 输出最大的个数是多少
求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...
- poj 1611 求0号结点所在集合的元素个数
求0号结点所在集合的元素个数 Sample Input 100 42 1 25 10 13 11 12 142 0 12 99 2200 21 55 1 2 3 4 51 00 0Sample Out ...
- [note]一类位运算求最值问题
[note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻 ...
- DFS算法-求集合的所有子集
目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...
- [LeetCode] Count Complete Tree Nodes 求完全二叉树的节点个数
Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...
- BC68(HD5606) 并查集+求集合元素
tree Accepts: 143 Submissions: 807 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
随机推荐
- linux中mariadb的安装
在Linux中mariaDB的安装 MariaDB其实就是MySQL的分支,是为了应对MySQL的即将的闭源风险所产生的. Linux系统中软件包的格式为mysql.rpm格式. 通过yum去安装 L ...
- django的配置文件字符串是怎么导入的?
写在开头: 每个APP都会有配置文件,像下代码Django等等这种的settings里面的配置导入都是字符串的,他们是怎么做的呢? MIDDLEWARE = [ 'django.middleware. ...
- [2017BUAA软工助教]团队建议
关于团队项目的个人建议 (以下排名不分先后) 一.hotcode5 你们组要做一个"课件-心得"共享平台 目前最大的竞争对手其实不是北航课程中心网站,而是每个系自己的大班群. 热心 ...
- Java 数据库操作
目录 Java数据库组织架构 下载驱动包 连接数据库 连接数据库的三个步骤 连接数据库的高开销 Statement接口介绍 PreparedStatement类 使用PreparedStatement ...
- ubuntu安装chkconfig.deb系统服务管理工具
chkconfig简介:chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息. 参数用法: --add 增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统 ...
- apply和call方法
真伪数组转换 /* apply和call方法的作用: 专门用于修改方法内部的this 格式: call(对象, 参数1, 参数2, ...); apply(对象, [数组]); */ function ...
- java 8 jvm 内存配置
jdk8内存参数解析与修改(新的参数) - LikeTech - CSDN博客https://blog.csdn.net/lk7688535/article/details/51767333 Java ...
- Oracle SQL优化原则
原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...
- [转帖]关于CPU Cache -- 程序猿需要知道的那些事
关于CPU Cache -- 程序猿需要知道的那些事 很早之前读过作者的blog 记得作者在facebook 工作.. 还写过mysql相关的内容 大拿 本文将介绍一些作为程序猿或者IT从业者应该知道 ...
- Socket和ObjectOutputStream问题
用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接 用户代码 package com.jachs.ladflower.ladflower; import java.n ...