0
点赞
收藏
分享

微信扫一扫

字典树+思维

东言肆语 2022-03-12 阅读 70

XOR Inverse - 题目 - Daimayuan Online Judge

题意是给定一个数组,找到一个最小数x,使得每个数与x异或后逆序对最少。

首先我们可以发现,从高位枚举,高位的逆序对个数,不会被之后位的异或所影响,所以我们从高位枚举,看这一位取0和取1会产生新的多少逆序对,然后取小的那个。

首先最简单的方法是枚举每一位取反后用树状数组多次统计逆序对,复杂度很高,大概是o(30*n*logn).容易被卡.

这里从别人题解那看到一种字典树解法,可以在加数的时候就统计逆序对,用一个数组存两个子节点出现个数,在用一个数组存这个节点的两个子节点从父节点到这个节点逆序对个数,首先我们需要统计每一位每个节点的两个子节点的逆序对,为什么要统计每一位呢,因为,对于一个父节点来说,他的两个子节点都是相同前缀,这个时候可能产生新的逆序对,所以对每一层的所有节点都要做一次,哪怕上一层求出来了逆序对,也还要加上这一层新求出来的,为什么只要统计它自己的两个儿子呢,因为它的儿子和其他的节点前缀和不同,在上一层已经讨论出来了,上一层的数值大小已经决定了它的数值大小,然后最后做法也很简单,开一个二维数组,记录每一层的正序对和逆序对的总和,当加进来这位是1时,就把左子节点出现的次数给加到父节点的逆序对中来,然后最后统计每一层的正序对和逆序对,哪个大,我们就选择异或0还是1,正序对计算就是用两个子节点个数相乘-逆序对个数。

举报

相关推荐

0 条评论