HDU 4825 Xor Sum(经典01字典树+贪心)
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 1555 Accepted Submission(s): 657
输入的第一行是一个整数T(T < 10),表示共有T组数据。
每组数据的第一行输入两个正整数N,M(<1=N,M<=100000),接下来一行,包含N个正整数,代表 Zeus 的获得的集合,之后M行,每行一个正整数S,代表 Prometheus 询问的正整数。所有正整数均不超过2^32。
对于每个询问,输出一个正整数K,使得K与S异或值最大。
题目链接:HDU 4825
学习这个也学了挺久的,苦于能百度到的详细资料甚少,尤其很多是用静态数组开写的(节省内存看起来有一点麻烦),好像这题没看见用动态链表来写的(目前还是入门阶段就一直用着new或malloc写),今天看了好一会儿的代码终于看出一点头绪了
题目本身非常经典,就是给一堆数(就记为 Xi 吧)又给Q个询问,每次又给出一个特定的数S,求(Xi^S)的最大值。
首先异或就是两个二进制位置上的数不同就可以得到1相同则得到0,比如(10100)2^(01111)2=(11011)2,可以转换成十进制验证:20^15=27。
然后把每一个数都转换成二进制(位置要对齐,前面不足则补0),转换的长度就跟题目给的数据范围有关了,此题就33位就够了。更新字典树的顺序和过程与普通单词字典树一模一样,从左到右地遍历插入各位二进制数值,但显然next指针只有两个——next[0]与next[1],更新的最后把原来的值附到结尾节点的val上,表示这整条路对应的十进制是val。
然后如何求最大异或值呢,先要知道一般情况下正项等比数列前n-1项求和的值肯定要小于第n项的值,那也就是说最坏情况下走第x个节点而x+1~n均只能得到0的时候,也比不走x而x+1~n均得到1的情况好。
然后假设已经得到了最大异或值Max,那Max异或K就可以得到某个数Xi了,此时不知道Xi是什么,但是可以通过贪心找到它。
贪心从最高位也就是树的开始位置直接往当前二进制位值取反的节点走,走到底那个节点的val就是我们要找的Xi,这里我直接用bitset来代替位运算直观一点
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=33;
struct info
{
info *nxt[2];
int val;
info()
{
val=0;
fill(nxt,nxt+2,nullptr);
}
};
info *L;
void update(int n)
{
bitset<N> bit=n;
int i,indx;
info *cur=L;
for (i=32; i>=0; --i)
{
indx=bit[i];
if(!cur->nxt[indx])
{
info *one=new info();
cur->nxt[indx]=one;
cur=one;
}
else
cur=cur->nxt[indx];
}
cur->val=n;//末位置节点附着
}
int query(int k)
{
bitset<N> bit=k;
info *cur=L;
int indx,i;
for (i=32; i>=0; --i)
{
indx=bit[i];
if(cur->nxt[indx^1])//往取反位置走
cur=cur->nxt[indx^1];
else
cur=cur->nxt[indx];//没有的话只能继续往前走
}
return cur->val;
}
void desinfo(info *cur)//删除字典树释放内存防止MLE
{
for (int i=0; i<2; ++i)
if(cur->nxt[i])
desinfo(cur->nxt[i]);
delete cur;
}
int main(void)
{
int T,n,m,i,s,val;
scanf("%d",&T);
for (int q=1; q<=T; ++q)
{
L=new info();
scanf("%d%d",&n,&m);
for (i=0; i<n; ++i)
{
scanf("%d",&val);
update(val);
}
printf("Case #%d:\n",q);
for (i=0; i<m; ++i)
{
scanf("%d",&s);
printf("%d\n",query(s));
}
//desinfo(L);
}
return 0;
}
HDU 4825 Xor Sum(经典01字典树+贪心)的更多相关文章
- HDU 4825 Xor Sum(01字典树入门题)
http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...
- hdu 4825 Xor Sum(01字典树模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题解:一到01字典树的模版题,01字典树就是就是将一些树用二进制放到一个树上这样可以方便对整体异 ...
- HDU 4825 Xor Sum(01字典树)题解
思路:先把所有数字存进字典树,然后从最高位贪心. 代码: #include<set> #include<map> #include<stack> #include& ...
- HDU 4825 Xor Sum (裸字典树+二进制异或)
题目链接 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将 ...
- 2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- [Hdu4825]Xor Sum(01字典树)
Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问 ...
- hdu 4825 Xor Sum (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 4825 Xor Sum(trie+贪心)
hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...
- HDU 4825 Xor Sum (模板题)【01字典树】
<题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...
随机推荐
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- RocketMQ最佳实践
1.RocketMQ中的专业术语 Topic topic表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息.物流消息...... 一条消息必须有一个Topic. Tag Tag表示消息的第 ...
- 安装及升级node
一.mac下安装 1. 可直接在官网下载(http://nodejs.cn/),可使用命令查看版本: node -v node --version 同样npm同时也安装下来,可使用下面命令查看: np ...
- 二、JavaScript语言--JS基础--JavaScript入门篇
1.如何插入JS 使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<scri ...
- Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...
- 用DTD约束XML详解及示例
文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. dtd的三种引入方式 (1)引入外部的dtd文件 <!DOCTYPE 根元素名称 SYSTE ...
- Memcached启停脚本小结
编写配置文件 编写启动脚本 vim /etc/rc.d/init.d/memcached startesac and $<!= 0); } elsif (open PIDHANDLE," ...
- HTML-web storage
cookie:是一个在服务区和客户端间来回传送文本值的内置机制: 大小受限:一般4KB: 只要涉及cookie,它就会自动在服务器和浏览器之间传送: //会存在安全问题:多消耗网络宽带: 操作:de ...
- js:数据结构笔记8--集合
集合:唯一性,无序性: 基本结构: function Set () { this.dataStore = []; this.add = add; this.remove = remove; this. ...
- Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
Kali Linux 2016.2发布提供虚拟机以及系统镜像下载 Kali Linux 2016.2发布提供虚拟机以及系统镜像下载,本次Kali Linux 2016.2提供了五种桌面模式,分别为 ...