hdu 5014 Number Sequence

时间:2023-03-09 09:43:38
hdu 5014 Number Sequence

为了a异或b的和最大,只需另b在不大于n的情况下按位取反即可。

这里有两个输出小技巧可以参考:

1.在用printf输出__int64时,在windows下使用格式"%I64d",在linux下使用"%lld",在hdu中应使用"%I64d",如果拿不准就是用cout好了。

2.在遇到每个数之间有空格,最后一个数后面是换行时可以使用这个小技巧:

for (int i = ; i < n; i++ ) printf("%d%c", a[i], (i == n-? '\n' : ' '));

完整代码如下:

 #define MAXN 100005
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int arr[MAXN];
int ans[MAXN];
bool vis[MAXN];
int n;
void solve()
{
for( int i = n- ; i >= ; i-- )
{
if( vis[i] == )
{
int bit = ;
while(bit <= i)
{
bit <<= ;
}
ans[bit--i] = i;
ans[i] = bit - - i;
vis[i] = vis[bit--i] = ;
}
}
printf("%I64d\n", 1ll * n * (n-));
//cout<<1ll * n *(n-1)<<endl;
for( int i = ; i < n ; i++ )
{
printf("%d%c",ans[arr[i]], (i == n-? '\n' : ' '));
}
fill(vis, vis+MAXN, );
}
int main(int argc, char *argv[])
{
while(scanf("%d", &n) != EOF)
{
n++;
for( int i = ; i < n ; i++ )
{
scanf("%d", &arr[i]);
}
solve();
}
}