Little penguin Polo likes permutations. But most of all he likes permutations of integers from 0 to n, inclusive.
For permutation p = p0, p1, ..., pn, Polo has defined its beauty — number
.
Expression
means applying the operation of bitwise excluding "OR" to numbers
x and y. This operation exists in all modern programming languages, for example, in language
C++ and Java it is represented as "^" and in
Pascal — as "xor".
Help him find among all permutations of integers from 0 to n the permutation with the maximum beauty.
The single line contains a positive integer n (1 ≤ n ≤ 106).
In the first line print integer m the maximum possible beauty. In the second line print any permutation of integers from 0 to n with the beauty equal to m.
If there are several suitable permutations, you are allowed to print any of them.
4
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#define LL long long
using namespace std;
const int maxn = 1000000 + 5;
LL pre[32];
int ans[maxn];
LL len(int x){
LL ret = 0;
while(x){
ret++;
x = x/2;;
}
return ret;
}
int main(){
int n;
LL total;
pre[0] = 0;
pre[1] = 1;
for(int i = 2;i < 32;i++) pre[i] = (pre[i-1]<<1) + 1;
while(cin >> n){
memset(ans,-1,sizeof(ans));
total = 0;
for(int i = n;i >= 0;i--){
if(ans[i] == -1){
int j = pre[len(i)]-i;
ans[i] = j;
ans[j] = i;
total += 2*pre[len(i)];
}
}
cout << total << endl;
for(int i = 0;i <= n;i++) printf("%d ",ans[i]);
cout << endl;
}
return 0;
}
本文介绍了一个关于整数排列的最大“美丽值”问题,即求从0到n的整数排列中,所有相邻元素进行XOR运算后的最大总和。通过分析给出了一种贪心算法实现思路,并附带了完整的C++代码实现。
238

被折叠的 条评论
为什么被折叠?



