异或、字典树
题意
给定长度为n的序列A,求三元组的个数(i,j,k),满足A[i]^A[j] < A[j]^A[k]且i < j< k.
- n<=5*10^5
题解
- 动态地将二进制的数加入到字典树中,枚举k,此时1…k-1已经加入字典树
- 然后枚举A[k]与A[i]的最高位不同的位置p,也就是加入字典树时,兄弟节点记录的个数num即为会产生贡献的A[i],那么会贡献num*tot[p][c],tot[i][p]表示前k-1个数中第i位为c的数的个数,0<=c<=1。
- 但是此时不满足i<j,所以需要减去j<=i的情况,所以加入字典树时同时记录sg,表示不满足的情况产生的贡献,那么就是++tot[i][c]。
代码
|
|