\(xor\) 最大值想到线性基,路径想到 \(lca\) 和树链剖分,由于没有修改用 \(lca\) 就可以。先用处理 \(fa\) 数组的方式处理倍增线性基(自然是得用线性基合并的),在求 \(lca\) 时把所有线性基全部合到一块儿就行。

考虑到本题实际上核心在于让路径上的线性基数量 \(\le O(\log n)\),所以也可以用点分治求解。三个时间复杂度应该都是 \(O(n\log^2n)\)。

本代码使用倍增。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20005,M=65;
int n,q,f[N][16],id[N];
vector<int>g[N];int dep[N];
struct lbas{
int ps[M];
lbas(){
memset(ps,0,sizeof(ps));
}inline void add(int x){
for(int i=60;~i;i--)
if((x>>i)&1){
if(ps[i]) x^=ps[i];
else{ps[i]=x;return;}
}
}inline void cov(lbas x){
for(int i=0;i<61;i++) ps[i]=x.ps[i];
}inline void merge(lbas x){
for(int i=0;i<61;i++)
if(x.ps[i]) add(x.ps[i]);
}inline int maxn(){
int re=0;
for(int i=60;~i;i--)
re=max(re,re^ps[i]);
return re;
}
}lb[N][16];
inline void dfs(int x,int fa){
lb[x][0].add(id[x]);
f[x][0]=fa,dep[x]=dep[fa]+1;
for(int i=0;i<15;i++){
f[x][i+1]=f[f[x][i]][i];
lb[x][i+1].cov(lb[f[x][i]][i]);
lb[x][i+1].merge(lb[x][i]);
}for(auto y:g[x])
if(y!=fa) dfs(y,x);
}inline int lca(int x,int y){
lbas sum;
if(dep[x]<dep[y]) swap(x,y);
for(int i=15;~i;i--)
if(dep[x]-dep[y]>=(1<<i))
sum.merge(lb[x][i]),x=f[x][i];
if(x==y) return sum.add(id[x]),sum.maxn();
for(int i=15;~i;i--){
if(f[x][i]==f[y][i]) continue;
sum.merge(lb[x][i]),x=f[x][i];
sum.merge(lb[y][i]),y=f[y][i];
}sum.add(id[f[x][0]]),sum.add(id[y]);
return sum.add(id[x]),sum.maxn();
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>id[i];
for(int i=1,x,y;i<n;i++)
cin>>x>>y,g[x].push_back(y),g[y].push_back(x);
dfs(1,0);
while(q--){
int x,y;cin>>x>>y;
cout<<lca(x,y)<<"\n";
}return 0;
}

[SCOI2016] 幸运数字 题解的更多相关文章

  1. BZOJ4568:[SCOI2016]幸运数字——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4568 https://www.luogu.org/problemnew/show/P3292 A ...

  2. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  3. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

    [BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...

  4. bzoj4568: [Scoi2016]幸运数字(LCA+线性基)

    4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...

  5. 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增

    P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...

  6. BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]

    4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...

  7. [SCOI2016]幸运数字 树链剖分,线性基

    [SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...

  8. bzoj 4568: [Scoi2016]幸运数字

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 848  Solved: 336[Submit][Status ...

  9. 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)

    4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...

  10. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1791  Solved: 685[Submit][Statu ...

随机推荐

  1. ZCMU-1149

    就是背包01问题 #include<iostream> #include<cstring> /*01背包问题*/ using namespace std; const int ...

  2. CSS 样式百分比

    1.宽高百分比 元素宽度/高度百分比是基于父级元素的width/height,不包含padding,border 注意:高度百分比一定要求父元素有设置height属性,只设置 min-height 虽 ...

  3. redmine部署,踩坑而过

    背景:部门想用个工具来做项目执行进度的管理,为了保证数据私有并且不想花钱,选了redmine. 环境:阿里云服务器,windows server R2企业版 软件版本构成: 官方版本说明http:// ...

  4. 配合 envoy 使用 Zipkin

    use zipkin in envoy document: https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/zipkin.htm ...

  5. 【C#】【类设计器】【类图】类图安装与简单使用

    安装 使用 Ctrl + Shift + A 或者按下图操作

  6. Gmssl编译问题: error while loading shared libraries: libssl.so.1.1: cannot open shared object file

    在Centos7上编译安装Gmssl后,运行gmssl version出现如下错误: gmssl: error while loading shared libraries: libssl.so.1. ...

  7. tc端口流量控制(带宽限速)

    tc qdisc add dev ens192 root handle 1: htbtc class add dev ens192 parent 1: classid 1:1 htb rate 80m ...

  8. maven打包时跳过TEST的方式汇总

    使用maven打包时如何跳过test,有以下几种方式 针对spring项目 <plugin> <groupId>org.apache.maven.plugins</gro ...

  9. shell中字符串比较和模糊比较说明

    shell字符串比较说明 1 完全比较方法(完全匹配) if [ "$soure" == "$dest" ]; then echo "is ==&qu ...

  10. java正则表达式(find()和 matches())

    1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数. matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为 ...