hdu 5014 Number Sequence

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

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

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

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

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

完整代码如下:

 1 #define MAXN 100005
 2 #include <stdlib.h>
 3 #include <iostream>
 4 #include <stdio.h>
 5 using namespace std;
 6 int arr[MAXN];
 7 int ans[MAXN];
 8 bool vis[MAXN];
 9 int n;
10 void solve()
11 {
12     for( int i = n-1 ; i >= 0 ; i-- )
13     {
14         if( vis[i] == 0 )
15         {
16             int bit = 1;
17             while(bit <= i)
18             {
19                 bit <<= 1;
20             }
21             ans[bit-1-i] = i;
22             ans[i] = bit - 1 - i;
23             vis[i] = vis[bit-1-i] = 1;
24         }
25     }
26     printf("%I64d
", 1ll * n * (n-1));
27     //cout<<1ll * n *(n-1)<<endl;
28     for( int i = 0 ; i < n ; i++ )
29     {
30         printf("%d%c",ans[arr[i]], (i == n-1? '
' : ' '));
31     }
32     fill(vis, vis+MAXN, 0);
33 }
34 int main(int argc, char *argv[])
35 {
36     while(scanf("%d", &n) != EOF)
37     {
38         n++;
39         for( int i = 0 ; i < n ; i++ )
40         {
41             scanf("%d", &arr[i]);
42         }
43         solve();
44     }
45 }
原文地址:https://www.cnblogs.com/jostree/p/3996122.html