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? '\n' : ' '));

完整代码如下:

 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\n", 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? '\n' : ' '));

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 }

 

你可能感兴趣的:(sequence)