牛客周赛 Round 90——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;
}

浙公网安备 33010602011771号