比赛 |
4043级2023省选练习赛2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
幸运数字 |
最终得分 |
100 |
用户昵称 |
yrtiop |
运行时间 |
20.017 s |
代码语言 |
C++ |
内存使用 |
147.29 MiB |
提交时间 |
2023-03-06 19:33:11 |
显示代码纯文本
- #include <bits/stdc++.h>
- using i64 = long long;
- #define pb emplace_back
-
- const int maxn = 2e4 + 5;
- const int maxm = 61;
- const int N = 15;
- std::vector<int> G[maxn];
- int n,q,f[N][maxn],d[maxn],lg[maxn],MAXLOG;
- i64 a[maxn];
-
- struct node {
- i64 d[maxm];
- node() {
- memset(d , 0 , sizeof(d));
- }
- void insert(i64 x) {
- for(int i = MAXLOG;~ i;-- i)
- if(x >> i & 1) {
- if(d[i])
- x ^= d[i];
- else {
- d[i] = x;
- break ;
- }
- }
- return ;
- }
- } sum[N][maxn],ans;
-
- void merge(const node& p) {
- for(int i = MAXLOG;~ i;-- i)
- ans.insert(p.d[i]);
- return ;
- }
-
- void dfs(int u,int fa) {
- for(auto& v : G[u]) {
- if(v == fa)
- continue ;
- d[v] = d[u] + 1;
- f[0][v] = u;
- sum[0][v].insert(a[v]);
- for(int k = 1;k <= lg[d[v]];++ k) {
- f[k][v] = f[k - 1][f[k - 1][v]];
- sum[k][v] = sum[k - 1][v];
- for(int p = MAXLOG;~ p;-- p)
- sum[k][v].insert(sum[k - 1][f[k - 1][v]].d[p]);
- }
- dfs(v , u);
- }
- return ;
- }
-
- i64 solve() {
- i64 res = 0;
- for(int k = MAXLOG;~ k;-- k)
- res = std::max(res , res ^ ans.d[k]);
- return res;
- }
-
- i64 calc(int u,int v) {
- memset(ans.d , 0 , sizeof(ans.d));
- if(d[u] < d[v])
- std::swap(u , v);
- for(int k = lg[d[u]];~ k;-- k) {
- if(d[u] - (1 << k) >= d[v])
- merge(sum[k][u]),u = f[k][u];
- if(u == v)
- return merge(sum[0][u]),solve();
- }
- for(int k = lg[d[u]];~ k;-- k)
- if(f[k][u] != f[k][v])
- merge(sum[k][u]),merge(sum[k][v]),u = f[k][u],v = f[k][v];
- merge(sum[0][f[0][u]]);
- merge(sum[0][u]);
- merge(sum[0][v]);
- return solve();
- }
-
- int main() {
- freopen("luckynum.in","r",stdin);
- freopen("luckynum.out","w",stdout);
- scanf("%d %d",&n,&q);
- for(int i = 1;i <= n;++ i)
- scanf("%lld",&a[i]),MAXLOG = std::max(MAXLOG , (int)std::log2(a[i]));
- for(int i = 2;i <= n;++ i) {
- int u,v;
- scanf("%d %d",&u,&v);
- G[u].pb(v);
- G[v].pb(u);
- lg[i] = lg[i >> 1] + 1;
- }
- sum[0][1].insert(a[1]);
- dfs(1 , 0);
- while(q --) {
- int u,v;
- scanf("%d %d",&u,&v);
- printf("%lld\n",calc(u , v));
- }
- return 0;
- }