• XOR Construction


    思路:

            通过题目可以得出结论
            b1^b2=a1

            b2^b3=a2

            .......

            bn-1^bn=an-1

    所以就可以得出

            (b1^b2)^(b2^b3)=a1^a2

            b1^b3=a1^a2

    有因为当确定一个数的时候就可以通过异或得到其他所有的数,且题目所求的是一个n-1的全排列

    那么求出a的前缀异或和arr之后就得到bi=b1^arri

    实际上实在寻找一个 b1 使得异或出来的所有值越小越好,所以拆位,假设所有数字的第 i位为 1 的个数大于为 0 的个数,那我们最好异或上一个 2^i,这样可以使大部分数字变小。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. //#include
    14. #include
    15. #include
    16. #include
    17. #include
    18. #define dbug cout<<"*****hear*****"<
    19. #define rep(a,b,c) for(ll a=b;a<=c;a++)
    20. #define per(a,b,c) for(ll a=b;a>=c;a--)
    21. #define no cout<<"NO"<
    22. #define yes cout<<"YES"<
    23. #define endl "\n"//交互题一定要关!!!!!!!!!
    24. #define lowbit(x) (x&-x)
    25. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    26. //priority_queue,greater >q;
    27. using namespace std;
    28. typedef long long ll;
    29. typedef long double ld;
    30. typedef pair PII;
    31. typedef pair<long double,long double> PDD;
    32. ll INF = 0x3f3f3f3f;
    33. //const ll LINF=LLONG_MAX;
    34. // int get_len(int x1,int y1,int x2,int y2)
    35. // {
    36. // return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
    37. // }
    38. const ll N = 2e5+ 10;
    39. const ll mod1 =998244353;
    40. const ll mod2 =1e9+7;
    41. // const ll hash_num = 3e9+9;
    42. ll n,m,ca;
    43. ll arr[N],brr[N],crr[N],drr[N];
    44. //ll h[N],ne[N],e[N],w[N],book[N],idx;
    45. //ll idx;
    46. // void add(ll a, ll b , ll c)
    47. // {
    48. // e[idx] = b, w[idx] = c,ne[idx] = h[a], h[a] =idx ++ ;
    49. // }
    50. void solve()
    51. {
    52. cin >> n;
    53. arr[0]=0;
    54. rep(i,1,n-1)
    55. {
    56. cin >> arr[i];
    57. arr[i] ^= arr[i-1];
    58. }
    59. ll ans=0;
    60. rep(i,0,20)
    61. {
    62. ll sum1=0;
    63. ll sum2=0;
    64. rep(j,0,n-1)
    65. {
    66. if(arr[j]>>i&1)sum1++;
    67. else
    68. {
    69. sum2++;
    70. }
    71. }
    72. if(sum1>sum2)ans|=1<
    73. }
    74. rep(i,0,n-1)arr[i]^=ans;
    75. rep(i,0,n-1)cout << arr[i]<<' ';
    76. }
    77. int main()
    78. {
    79. IOS;
    80. ll _;
    81. _=1;
    82. //scanf("%lld",&_);
    83. //cin>>_;
    84. ca=1;
    85. while(_--)
    86. {
    87. solve();
    88. ca++;
    89. }
    90. return 0;
    91. }

     

  • 相关阅读:
    webpack5 import动态导入实现按需加载并给文件统一命名
    记录一下MySql update会锁定哪些范围的数据
    spring链路 sleuth zipkin
    服务器硬件基础知识
    深入理解并发编程同步工具类
    VQA的应用(调研)
    开关电源反激式线圈分析
    LightDB23.4 table函数支持column_value列
    算法-贪心+优先级队列-IPO
    如何在idea中隐藏文件或文件夹
  • 原文地址:https://blog.csdn.net/qq_73261465/article/details/134334866