牛客周赛 Round 90——Tk的排列间异或

题目

Tk的排列间异或

题解

这是一道构造题,要求异或后的和最大,那我们要秉持不浪费的原则,从高位枚举,确保每一个1都最终保留了下来。如果一个数和另一个数匹配最佳,那么另一个数的最佳匹配也应该是它。举几个例子后不难发现。每次2 bit 到后面的数,都会匹配前面相邻的数。

example
n = 10
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010

参考代码

#include<iostream>
#include<vector>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> ans(n + 1);
    int R = n;
    while(R > 0) {
        int bit = -1;
        for(int i = 20; i >= 0; i--) {
            if(R >> i & 1) {
                bit = i;
                break;
            }
        }
        int L = 1 << bit;
        int len = R - L + 1;
        int nR = R - 2 * len + 1;
        for(int i = nR, j = R; i < j; i++, j--) {
            ans[i] = j;
            ans[j] = i;
        }
        R = nR - 1;
    }
    int x;
    for(int i = 1; i <= n; i++) {
        cin >> x;
        cout << ans[x] << " \n"[i == n];
    }
    return 0;
}
posted @ 2025-04-21 11:37  PZnwbh  阅读(47)  评论(0)    收藏  举报