http://acm.hdu.edu.cn/showproblem.php?pid=5014
题意略。
分析: 通过发现规律贪心处理即可,从n开始反向遍历到0,假设与数i匹配的是 Xi;
那么i^Xi的二进制位一定全1,并且二进制位数等于i的二进制位数
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
const int N=1e5+100;
using namespace std;
typedef long long ll;
int a[N];
int b[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(b,-1,sizeof(b));
for(int i=0;i<=n;i++)scanf("%d",&a[i]);
ll sum=0;
for(int i=n;i>=0;i--)
{
if(b[i]!=-1)continue;
int tmp=i,ans=0,cnt=1;
while(tmp)
{
if((tmp&1)==0)ans+=cnt;
tmp>>=1;
cnt*=2;
}
sum+=2*(i^ans);
b[i]=ans;
b[ans]=i;
}
printf("%I64d\n",sum);
for(int i=0;i<=n;i++)
{
if(i==0)printf("%d",b[a[i]]);
else printf(" %d",b[a[i]]);
}
printf("\n");
}
return 0;
}
时间: 2024-10-27 02:14:49