codevs 3031:最富有的人

题目描述 Description
在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择。

输入描述 Input Description
第一行包含两个正整数n,表示有n堆金子。
第二行包含n个正整数,表示每堆金子的价值。

输出描述 Output Description
第一行包含一个正整数,表示能获得的最大总价值。

样例输入 Sample Input
10
1 2 3 4 5 6 7 8 9 10

样例输出 Sample Output
15

数据范围及提示 Data Size & Hint
数据范围:
n<=100000 每堆金子数<=2^31-1

题目

  芒果君:这道题第一个难点在,你特么看不出它是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;

  

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define maxn 100010
 5 using namespace std;
 6 int trie[maxn<<6][3],cnt,n;
 7 long long a[maxn],ans;
 8 void insert(int x)
 9 {
10     int p=0;
11     for(int i=30;i>=0;--i){
12         int t=(x>>i)&1;
13         if(!trie[p][t]) p=trie[p][t]=++cnt;
14         else p=trie[p][t];
15     }
16 }
17 void query(int x)
18 {
19     int p=0;
20     long long sum=0;
21     for(int i=30;i>=0;--i){
22         int t=(x>>i)&1;
23         if(!trie[p][t^1]) p=trie[p][t];
24         else{
25             p=trie[p][t^1];
26             sum|=(1<<i);
27         }
28     }
29     ans=max(ans,sum);
30 }
31 int main()
32 {
33     scanf("%d",&n);
34     for(int i=1;i<=n;++i){
35         scanf("%lld",&a[i]);
36         insert(a[i]);
37     }
38     for(int i=1;i<=n;++i) query(a[i]);
39     printf("%lld\n",ans);
40     return 0;
41 }

  (PS:好久没有这么认真的写过题解了……)

时间: 2024-10-13 22:11:35

codevs 3031:最富有的人的相关文章

vodevs3031 最富有的人

在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行包含两个正整数n,表示有n堆金子.第二行包含n个正整数,表示每堆金子的价值. 输出描述 Output Description 第一行包含一个正整数,表示能获得的最大总价值. 样例输入 Sample Input 101 2 3 4 5 6 7 8 9 10 样例输出 Sample Output 15 数据范围及提示 Data Size

大国崛起背后:国人未富先懒 懒人拥有后发优势

上行受阻的社会和正在板结的阶层 未富先懒 改革开放好是好,只是机会在减少. “大国崛起”的背后,三大社会现实如同暗礁,成为中国人追求财富和理想生活之敌: 一是上行遇阻的社会.个人上行之路遇到阻碍,从户籍政策到财富分配机制,从行业规则到潜规则,从就业到买房:个人发展的代价太大,成长的成本太高,路径变窄,到处有看不见的天花板. 二是正在板结的阶层.现在有十大阶层和1838种职业,中产阶层正在形成,但贫富悬殊拉大,“一部分人先富起来”之后,成为与公众争利的利益集团.低收入阶层跃升到中产阶层.中产阶层跃

做一个有理想的IT人

前段时间一直以来都在思考生命的价值的问题,一直在想人的一生的追求是什么.在这个物欲横流的社会,对人的价值的定义只是在财富积累的多少,这个是大多数人所认为的.但人的一生顶多百年,百年之后这些虚荣划归为尘土.如果我们活在世上能够做出一些对社会与人类有正能量的东西,对人类社会的进步有重大作用的东西,那么你的价值就会被放大.我不否认我对钱很执着,很想成为一个富有的人.但是理想也很重要,我理想在有生之年能够做出来的一些东西可以改变人们的生活方式,让人们的活动更加便捷.我的理想和钱好像在一条直线上,很好,接

和优秀的人在一起真的很重要

1.普通人的圈子,谈论的是闲事,赚的是工资,想的是明天.2.生意人的圈子,谈论的是项目,赚的是利润,想的是下一年.3.事业人的圈子,谈论的是机会,赚的是财富,想到的是未来和保障.4.智慧人的圈子,谈论是给予,交流是的奉献,遵道而行,一切将会自然富足. 在现实生活中,您和谁在一起的确很重要,甚至能改变您的成长轨迹,决定您的人生成败. 和什么样的人在一起,就会有什么样的人生.● 和勤奋的人在一起,您不会懒惰.● 和积极的人在一起,您不会消沉.● 与智者同行,你会不同凡响.● 与高人为伍,您能登上巅峰

我的投资、理財、財富观

財富是什么?我觉得是 人.理想.感情.金钱.思想. 传统意义上.金钱才是財富 .由于几千年来,仅仅有金钱被全部人接受.而我觉得,金钱仅仅是物质財富的最佳代表.金钱能够与绝大多数的物质財富等价交换,但不能与精神財富等价交换. 人类社会,財富分3种:人.精神(理想.思想.感情等).物质(金钱等) . 人,人类社会的一切都是环绕"人" 在运作.要不然,为什么叫做"人类文明"呢. 人是財富的拥有者.没有人.精神不复存在.金钱仅仅是一堆废纸废铁. 精神,人类社会不断发展.最重

【JDFZOJ】最富有的人 Trie树+异或性质

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43446799"); } 题面: 最富有的人 Time Limit: 1 Sec  Memory Limit: 64 MB Description 你经过了一段时间的打工,老板带你来到了他的私人金库. 在你的面前有n堆金子,老板要求你只能选择其中的两堆

取心出准取十达近就适解改人pigkfuvQbIh

很多人小时候,都曾经被父母口中"别人家的孩子"笼罩.那个孩子从小学一年级的期末考试,就考年级第一,平时参加各种活动,该玩的都玩,到了高三高考,依然是年级第一名,毕业之后,又拿到硕士.博士和国际奖项.如果有这样一个孩子,是不是很遭恨? 很不幸,我自己就是这样一个遭恨的"别人家的孩子".这点我平时都不敢讲.但其实我自己知道,我心中的自我,和别人看到的这个"别人家的孩子",绝对不一样. 我心中的成长岁月,失落多于骄傲.在我自己的眼中,成长并不是充满成功

现在的努力与汗水,是为了你以后所想的基石

2016年7月28日晚,参加了和马哥一对一的技术交流指导研讨会,对于现在的自己,我有些许希望,也有些许失望.面对这些烦琐的事情时,总会很纠结,甚至不知道该如何起步.结束后,我又进行了一次重要的选择,选择了马哥的Linux+Python运维课程,希望自己能进一步加强自己的实力,也希望这段拼搏的时光能让自己在有生之年也是一份宝贵的回忆! 2013年7月的我大专计算机网络技术专业毕业,和几个朋友去到了广州,找到了一份做系统运维的工作,当时的自己对linux这块只是有些基础.前期因为部门是刚成立的,我就

2017-08-12

别问别人为什么,多问自己凭什么 乐观的人只顾着微笑,而忘了怨: 悲观的人只顾着怨,而忘记笑: 真正的美丽,不是青春的容颜,而是绽放的心灵: 你能帮多少人 就有多少人来帮你 十年前你是谁,一年前你是谁,甚至昨天你是谁,都不重要.重要的是,今天你是谁,以及明天你将成为谁. 唯累过,方得闲:唯苦过,方知甜.趁着年轻,大胆地走出去,去迎接风霜雨雪的洗礼,练就一颗忍耐.豁达.睿智的心,幸福才会来. 这世界上除了你自己,没谁可以真正帮到你,就算帮也是暂时的. 有人看到一只蝴蝶挣扎着想从蛹里脱离出来,他出于好