比赛 4043级2023省选练习赛2 评测结果 AAAAAAAAAA
题目名称 幸运数字 最终得分 100
用户昵称 yrtiop 运行时间 20.017 s
代码语言 C++ 内存使用 147.29 MiB
提交时间 2023-03-06 19:33:11
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using i64 = long long;
  3. #define pb emplace_back
  4.  
  5. const int maxn = 2e4 + 5;
  6. const int maxm = 61;
  7. const int N = 15;
  8. std::vector<int> G[maxn];
  9. int n,q,f[N][maxn],d[maxn],lg[maxn],MAXLOG;
  10. i64 a[maxn];
  11.  
  12. struct node {
  13. i64 d[maxm];
  14. node() {
  15. memset(d , 0 , sizeof(d));
  16. }
  17. void insert(i64 x) {
  18. for(int i = MAXLOG;~ i;-- i)
  19. if(x >> i & 1) {
  20. if(d[i])
  21. x ^= d[i];
  22. else {
  23. d[i] = x;
  24. break ;
  25. }
  26. }
  27. return ;
  28. }
  29. } sum[N][maxn],ans;
  30.  
  31. void merge(const node& p) {
  32. for(int i = MAXLOG;~ i;-- i)
  33. ans.insert(p.d[i]);
  34. return ;
  35. }
  36.  
  37. void dfs(int u,int fa) {
  38. for(auto& v : G[u]) {
  39. if(v == fa)
  40. continue ;
  41. d[v] = d[u] + 1;
  42. f[0][v] = u;
  43. sum[0][v].insert(a[v]);
  44. for(int k = 1;k <= lg[d[v]];++ k) {
  45. f[k][v] = f[k - 1][f[k - 1][v]];
  46. sum[k][v] = sum[k - 1][v];
  47. for(int p = MAXLOG;~ p;-- p)
  48. sum[k][v].insert(sum[k - 1][f[k - 1][v]].d[p]);
  49. }
  50. dfs(v , u);
  51. }
  52. return ;
  53. }
  54.  
  55. i64 solve() {
  56. i64 res = 0;
  57. for(int k = MAXLOG;~ k;-- k)
  58. res = std::max(res , res ^ ans.d[k]);
  59. return res;
  60. }
  61.  
  62. i64 calc(int u,int v) {
  63. memset(ans.d , 0 , sizeof(ans.d));
  64. if(d[u] < d[v])
  65. std::swap(u , v);
  66. for(int k = lg[d[u]];~ k;-- k) {
  67. if(d[u] - (1 << k) >= d[v])
  68. merge(sum[k][u]),u = f[k][u];
  69. if(u == v)
  70. return merge(sum[0][u]),solve();
  71. }
  72. for(int k = lg[d[u]];~ k;-- k)
  73. if(f[k][u] != f[k][v])
  74. merge(sum[k][u]),merge(sum[k][v]),u = f[k][u],v = f[k][v];
  75. merge(sum[0][f[0][u]]);
  76. merge(sum[0][u]);
  77. merge(sum[0][v]);
  78. return solve();
  79. }
  80.  
  81. int main() {
  82. freopen("luckynum.in","r",stdin);
  83. freopen("luckynum.out","w",stdout);
  84. scanf("%d %d",&n,&q);
  85. for(int i = 1;i <= n;++ i)
  86. scanf("%lld",&a[i]),MAXLOG = std::max(MAXLOG , (int)std::log2(a[i]));
  87. for(int i = 2;i <= n;++ i) {
  88. int u,v;
  89. scanf("%d %d",&u,&v);
  90. G[u].pb(v);
  91. G[v].pb(u);
  92. lg[i] = lg[i >> 1] + 1;
  93. }
  94. sum[0][1].insert(a[1]);
  95. dfs(1 , 0);
  96. while(q --) {
  97. int u,v;
  98. scanf("%d %d",&u,&v);
  99. printf("%lld\n",calc(u , v));
  100. }
  101. return 0;
  102. }