高斯消元学习
2015-09-05 13:50
316 查看
1. 证明XOR满足交换律,结合律,是自身的逆运算。
比如说,1^0 = 1 1^1 = 0 0^1 = 1 0^0 = 0
1^1^0 = 0 = 1^0^1 = 0.
a^b^a=b 即一个数异或两次相当于无效
2. 从N个数中选出两个数,使XOR和最大。
解法:
我们知道两个数字之间的异或运算都是按位异或,也就是说把他们各自化成为二进制的形式,然后,每次查找与这个数字差别最大的数。
比如现在有,0111,0000,0101,1010. 我们查找最大的异或结果。
可以建立一个trie树。
二进制的比较,要从高位到低位,要使异或和最大,那么我们就枚举第i个数字,查找与第i个数字相差最大的数字是多少,高位优先。
比如说,查找与0 1 1 1 相互异或后得到的最大值的数字是多少,我们的思路肯定是从root开始,依次从高位开始寻找与0 1 1 1 相异或的数字,如果遇到相同的位置,那么就妥协处理。
3. lN个点的边带权的树,找一条路径使XOR和最大。
解法:
任选一个根,h_i表示的是从根节点到节点i的路径的XOR和
X到Y的路径XOR和表示为h_x XOR h_y
4. 从N个数中选出若干个,使XOR和为K,给出方案或指出不可行。
解法:
X_i 为0,表示的是第i个数不选,X_i为1,表示的是第i个数选。
现在考虑K的第p位的情况:
如果K的第p位是1,则第p个二进制位为1的数字有奇数个被选择
如果K的第p位是0,则第p个二进制位为1的数字有偶数个被选择
得到方程X_i1+X_i2+X_i3+...+X_is = Kp ( + 都是XOR )
联立60个方程,方程的解,等价于原问题的解。
比如说,1^0 = 1 1^1 = 0 0^1 = 1 0^0 = 0
1^1^0 = 0 = 1^0^1 = 0.
a^b^a=b 即一个数异或两次相当于无效
2. 从N个数中选出两个数,使XOR和最大。
解法:
我们知道两个数字之间的异或运算都是按位异或,也就是说把他们各自化成为二进制的形式,然后,每次查找与这个数字差别最大的数。
比如现在有,0111,0000,0101,1010. 我们查找最大的异或结果。
可以建立一个trie树。
二进制的比较,要从高位到低位,要使异或和最大,那么我们就枚举第i个数字,查找与第i个数字相差最大的数字是多少,高位优先。
比如说,查找与0 1 1 1 相互异或后得到的最大值的数字是多少,我们的思路肯定是从root开始,依次从高位开始寻找与0 1 1 1 相异或的数字,如果遇到相同的位置,那么就妥协处理。
3. lN个点的边带权的树,找一条路径使XOR和最大。
解法:
任选一个根,h_i表示的是从根节点到节点i的路径的XOR和
X到Y的路径XOR和表示为h_x XOR h_y
4. 从N个数中选出若干个,使XOR和为K,给出方案或指出不可行。
解法:
X_i 为0,表示的是第i个数不选,X_i为1,表示的是第i个数选。
现在考虑K的第p位的情况:
如果K的第p位是1,则第p个二进制位为1的数字有奇数个被选择
如果K的第p位是0,则第p个二进制位为1的数字有偶数个被选择
得到方程X_i1+X_i2+X_i3+...+X_is = Kp ( + 都是XOR )
联立60个方程,方程的解,等价于原问题的解。
相关文章推荐
- NDK开发之调用方法
- 联考1day1总结
- 终于看到配置成功的Android模拟器是什么样子
- shell中的特殊符号总结
- json序列化与反序列化
- mysql + unidac 使用事务例子
- varnish 页面跳转
- 条款17 以独立语句将new对象置入智能指针
- quick-cocos2d-x数据存储之GameState
- spring Bean的生命周期
- 《剑指Offer》面试题:合并两个排序的链表
- linux配置java环境变量(详细)
- 哗啦啦族的24点游戏(DFS)
- hdu 2577 dp
- 第10章 信号
- 野人学Android基础篇之四大组件第一课--Activity的Intent传递
- Linux下JDK环境变量配置
- 黑马程序员java之网络通讯
- JavaScript四种跨域方式详解
- 命运永远都掌握在我们自己的手中