题目:http://hzwer.com/3708.html分析:类似树分治思想,设f[x][i]表示以x为根的子树的所有点中,与x的距离为i的点有多少个,这个可以预处理出来然后我们考虑每颗子树对ans的贡献1、以x为起点的某条链i,ans+=f[x][i]2、以x为起点的两颗不同的子树i,j: .....
分类:
Web程序 时间:
2015-03-28 23:08:05
阅读次数:
377
/*异或的简单应用 a^a = 0*/class Solution {public: int singleNumber(int A[], int n) { int sum = 0; for(int i = 0 ; i < n ; i++){ s...
分类:
其他好文 时间:
2015-03-28 21:41:34
阅读次数:
115
位运算的几个运算符 |(或) &(与) ~(非) ^(异或) >>(右移) >一般机器支持两种右移:逻辑右移和算数右移。逻辑右移在右边补0: x >> k ==> [0,...0, xn-1,xn-2,...x0]算术右移在右边补最高位有效值(0或1,这个在有符号数据中比较有用):x >> k =....
分类:
其他好文 时间:
2015-03-28 17:07:03
阅读次数:
134
今天在看C语言的位运算时,看到了如下交换a,b两值的方法: a = a^b; b = a^b; a = a^b;后来想想,真是太神奇了!其实,我们首先知道,对于任意的x满足: x^x == 0; x^0 == x;那么上面的式子事实上是利用了如上的规则,首先用a保存了a^b的 值,再用b = a ^...
分类:
其他好文 时间:
2015-03-27 23:42:54
阅读次数:
158
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。还是理解不够深刻。 这题的主要思路还是之前的数组中只出现一次的数字的那种模式,一次遍历加上异或运算。那么这个异或的值肯定是这两个只出现一次的数字的相异或的...
分类:
编程语言 时间:
2015-03-21 22:42:34
阅读次数:
221
题目一个整型数组里除了两个数字之外,其他的数字都是出现了两次。请写出程序找出这两个只出现了一次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)。题解tip1:如果该数组A中只有一个数字出现了一次,其他的数字都出现了两次,那么求出该数字就很简单,其值就是 A[0] ^ A[1] ^ … ^ A[n-1]
因此就需要想办法,将问题转换为tip1里的问题场景。
tip2:将题目中的数组的每个数...
分类:
编程语言 时间:
2015-03-21 01:14:30
阅读次数:
225
我们需要知道一个事实,trie树上是可以要求第k大的!我们每个节点记个size值然后像其他数据结构一样维护就可以了然后我们再搞个priority_queue什么的就好了,注意每个值会出现两次只要记一次 1 /*********************************************....
分类:
其他好文 时间:
2015-03-20 23:36:29
阅读次数:
164
题解:
首先我们处理出来sum[0,n]sum[0,n]作为异或前缀和,然后答案就不再是[l,r][l,r]中间某段区间的异或和,而转化成求了[l?1,r][l-1,r]中任意两点异或和的最大值。
然后我们分块处理出fi,jf_{i,j}表示 [第i块的开头,j?1][第i块的开头,j-1] 这段区间中任取一点和点jj异或和的最大值,而用gi,jg_{i,j}做个类似前缀和的操作,记录第ii块...
分类:
其他好文 时间:
2015-03-20 22:07:44
阅读次数:
223
C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述。不使用中间变量: 1 // 异或, a^=b^=a^=b; 2 a ^= b; 3 b ^= a; 4 a ^= b; 5 6 // 加减 7 a = a + b; 8 b = a - b; 9 a = a - b;10 11 // 乘....
分类:
编程语言 时间:
2015-03-20 18:01:54
阅读次数:
170
const maxn=600008; len=24;var x,y,z,n,m,tot,lx,i:longint; sum:array[0..maxn] of longint; rt:array[0..maxn] of longint; time,l,r:array[0....
分类:
其他好文 时间:
2015-03-20 17:59:54
阅读次数:
115