codevs 3031:最富有的人
题目描述 Description
在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择。 输入描述 Input Description
第一行包含两个正整数n,表示有n堆金子。
第二行包含n个正整数,表示每堆金子的价值。 输出描述 Output Description
第一行包含一个正整数,表示能获得的最大总价值。 样例输入 Sample Input 样例输出 Sample Output 数据范围及提示 Data Size & Hint
数据范围:
n<= 每堆金子数<=^-
题目
芒果君:这道题第一个难点在,你特么看不出它是trie树啊啊啊啊!

然后,就算你看出来了,不会位运算,也hin难搞。
过程描述起来很简单,就是把每个数字变成二进制从位数上限开始建立trie树,再逐个查询,尽量向“1”的方向走取最大更新答案。这里出现的几个位运算我弱弱的解释一下。
① (x>>i)&1 的作用是找到二进制下x从右到左的第i+1位,一个数“>>”右移i是除以2的x次方,“&”叫位与,同为1则为1,否则为0,用它可以找到二进制的每一位数,因为1&1=1,0&1=0;
② trie[p][t^1] “^”叫异或,不同为1相同为0,你可以理解为“不进位的加法”,0^0=0,0^1=1,1^1=0,而且我才发现这道题用它找路的奇妙性质。我们的贪心策略是尽量往1走,如果该位是0需要1变成1,1需要0变成1,但是你有木有发现,它需要的“路”其实就是该位的数字与1异或的结果!
③total|=(1<<i) 左移“<<”就是乘2的i次方,“|”位或,只要有一个是1就是1,不然是0,它在这里可以强行把那一位改成1;
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int trie[maxn<<][],cnt,n;
long long a[maxn],ans;
void insert(int x)
{
int p=;
for(int i=;i>=;--i){
int t=(x>>i)&;
if(!trie[p][t]) p=trie[p][t]=++cnt;
else p=trie[p][t];
}
}
void query(int x)
{
int p=;
long long sum=;
for(int i=;i>=;--i){
int t=(x>>i)&;
if(!trie[p][t^]) p=trie[p][t];
else{
p=trie[p][t^];
sum|=(<<i);
}
}
ans=max(ans,sum);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%lld",&a[i]);
insert(a[i]);
}
for(int i=;i<=n;++i) query(a[i]);
printf("%lld\n",ans);
return ;
}
(PS:好久没有这么认真的写过题解了……)
codevs 3031:最富有的人的更多相关文章
- codevs3031 最富有的人
题目描述 Description 在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行 ...
- vodevs3031 最富有的人
在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行包含两个正整数n,表示有n堆金子. ...
- 做一个有理想的IT人
前段时间一直以来都在思考生命的价值的问题,一直在想人的一生的追求是什么.在这个物欲横流的社会,对人的价值的定义只是在财富积累的多少,这个是大多数人所认为的.但人的一生顶多百年,百年之后这些虚荣划归为尘 ...
- sentence patterns
第四部分 推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
- 张艾迪(创始人):创始人故事无限N个
世界第一女孩+世界第一互联网女孩 创始人故事无限N个 全球第一互联网女孩EidyZhang艾迪.张 The World No.1 Girl :Eidyzhang The World No.1 Inte ...
- AMD平台下在Windows虚拟机中安装Mac10.8.6【Written By KillerLegend】
我的电脑CPU是AMD,以前在虚拟机中装过Windows操作系统,感觉很简单,这几天想体验一下苹果系统,未来也可能会从事Mac相关软件开发,于是从早上便兴致勃勃的开始了--于是悲剧也开始了,上网各种查 ...
- Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)
题目链接:http://codeforces.com/contest/672/problem/D 有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差 ...
- 【模拟】Codeforces 671B Robin Hood
题目链接: http://codeforces.com/problemset/problem/671/B 题目大意: N个人,每个人有Ci钱,现在有一个人劫富济贫,从最富的人之一拿走1元,再给最穷的人 ...
- CF 672 div2 D
http://codeforces.com/contest/672/problem/D 题目大意: 有n个人,每个人有pi的钱,然后可以由如下操作,每次都可以挑选一个最富有的人,把它的钱给最穷的人.但 ...
随机推荐
- 10 | MySQL为什么有时候会选错索引?
前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的.但是,你写SQL语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL来确定的. 不知道你有没有碰到 ...
- at/crontab
at yum -y install at systemctl start atd 增加任务 增加任务的第三行是 是ctrl+D 表示的是退出 第四行是系统提示任务执行的时间 任务查询 atq 任务删除 ...
- 欧几里得?x
可以去看dalao博客 orz 1.欧几里得算法 带余除法定理:a,b∈Z,其中b>0,存在唯一q及r,使a=bq+r,其中0<=r<b; 辗转相除法(欧几里得算法)依据:(a,b) ...
- java集合类-List接口
List接口包含List接口及List接口的所有实现类,List集合中的元素允许重复. List接口 List接口继承了Collection接口,包含Collection接口的所有方法,还定义了两个非 ...
- JavaWeb_(Spring框架)注解配置
系列博文 JavaWeb_(Spring框架)xml配置文件 传送门 JavaWeb_(Spring框架)注解配置 传送门 Spring注解配置 a)导包和约束:基本包.aop包+context约束 ...
- Elasticsearch的Search详解
介绍 ES不是新技术,是将全文检索和数据分析.分布式整合到一起. 基于lucene开发,提供简单的restful api接口.java api接口.其他语言开发接口等. 实现了分布式的搜索引擎和分析引 ...
- jinjia2-HTML 转义
当从模板生成 HTML 时,始终有这样的风险:变量包含影响已生成 HTML 的字符.有两种 解决方法:手动转义每个字符或默认自动转义所有的东西. Jinja 两者都支持,使用哪个取决于应用的配置.默认 ...
- DLL:操作数据库和表
1. 操作数据库 C(Create 创建) R(Retrieve 查询) U(Update 更新) D(Delete 删除) (1) 查询数据库 1) 查询所有数据库名称 SHOW DATABASES ...
- java课后实验性问题1
一.一个java类文件中只能有一个公有类吗? 测试代码 public class Test{ public static void main(String[] args){ } public clas ...
- MISS YOU
文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论