新疆大学五月月赛 H 题 XOR 好题 【思维】

传送门
题意: 给定n 个城市, 编号从0 - n-1, 连接任意两个城市的代价是这两个城市的编号异或和,问连接这n个城市的最小代价是多少.

思路:这道题的推导还是挺有意思, 我们可以一步一步看,
n = 2 时 答案肯定是1嘛.
n = 3 时 那么编号2和之前那个点连最优了? 肯定是0, 所以答案是3
n = 4 时 3 又和那个点连最优了, 那就是 2 吧, 因为最高位相同, 只留一个最低位, 所以答案是4.
…..
我们可以发现对一个数字, 它的二进制位中除了最低位的1, 这位1前面的一定都在前面的某个编号中出现过, 因为数是递增的吗, 所以最优的结果加到到达里面都是一个数最低位的1代表的数, 所以很明显答案就是前n - 1 个数的最低位1的代表的数的前缀和. 而如何快速求一个数的最低位1代表的数了, 学过树状数组的都知道那就是求一个lowbit即可, 即 tmp = x & (-x) .

AC Code

const int maxn = 2e4+5;
int f[maxn];
int ans[maxn];
void init() {
    for (int i = 2 ; i <= maxn-4 ; i ++) {
        f[i] = i &(-i);
    }
    ans[2] = 1;
    for (int i = 3 ; i <= maxn -4 ; i ++) {
        ans[i] = ans[i-1] + f[i-1];
    }
}
void solve()
{
    int n; init();
    while(cin >> n) {
        cout <<ans[n] << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/anxdada/article/details/80198112