传送门

不知道线性基是什么东西的可以看看蒟蒻的总结

第一眼:这不会是个倍增LCA暴力合并线性基吧……

打了一发……A了?

所以这真的是个暴力倍增LCA合并线性基么……

ps:据某大佬说其实可以离线之后用点分做,那样的话因为每次只要合并两个线性基,复杂度可以减一个$log$

 //minamoto
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
using namespace std;
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while((ch=getc())>''||ch<'')
(ch=='-')&&(flag=true);
for(res=num;(ch=getc())<=''&&ch>='';res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(ll x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=;
int n,q,tot,head[N],Next[N<<],ver[N<<],dep[N];
ll fa[N][],b[N][][],sum,ans[],val[N];
inline void add(int u,int v){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
}
inline void get(ll *b,ll x){
for(int i=;i>=;--i)
if(x>>i&){
if(!b[i]) return (void)(b[i]=x);
x^=b[i];
}
}
inline void merge(ll *b,ll *x){
for(int i=;i>=;--i)
if(x[i]) get(b,x[i]);
}
inline void init(int i){
for(int j=;j<;++j){
fa[i][j]=fa[fa[i][j-]][j-];
memcpy(b[i][j],b[i][j-],sizeof(b[i][j-]));
merge(b[i][j],b[fa[i][j-]][j-]);
}
}
void dfs(int u,int f){
fa[u][]=f,dep[u]=dep[f]+,init(u);
for(int i=head[u];i;i=Next[i])
if(ver[i]!=f) dfs(ver[i],u);
}
void LCA(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=;i>=;--i)
if(dep[fa[u][i]]>=dep[v])
merge(ans,b[u][i]),u=fa[u][i];
if(u==v) return (void)(merge(ans,b[u][]));
for(int i=;i>=;--i)
if(fa[u][i]!=fa[v][i]){
merge(ans,b[u][i]),merge(ans,b[v][i]);
u=fa[u][i],v=fa[v][i];
}
merge(ans,b[u][]),merge(ans,b[v][]),merge(ans,b[fa[u][]][]);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),q=read();
for(int i=;i<=n;++i)
get(b[i][],val[i]=read());
for(int i=,u,v;i<n;++i)
u=read(),v=read(),add(u,v),add(v,u);
dfs(,);
while(q--){
memset(ans,,sizeof(ans));
int u=read(),v=read();
LCA(u,v);
sum=;
for(int i=;i>=;--i)
cmax(sum,sum^ans[i]);
print(sum);
}
Ot();
return ;
}

最新文章

  1. sql连着function使用
  2. Dagger2 生成代码学习
  3. tomcat浏览器地址支持中文方法
  4. LeetCode | Single Number II【转】
  5. 【linux】linux下yum安装后Apache、php、mysql默认安装路径
  6. CLRS:max_heap and min_heap operation (pseudocode)
  7. Android中Json数据读取与创建
  8. git for windows+TortoiseGit客户端的使用
  9. 截获控制台程序关闭事件(SetConsoleCtrlHandler)
  10. Delphi安装/卸载OCX控件的方法
  11. MySQL递归查询所有子节点,树形结构查询
  12. c++ iostream 相关使用
  13. python学习Day9 内存管理
  14. ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 (转载)
  15. python去重(针对密码)
  16. lvs笔记
  17. numpy 小示例
  18. iframe中的历史记录问题汇总及解决方案[转]
  19. 使用WinSCP连接linux
  20. nosql基本了解

热门文章

  1. CSS的两种盒模型
  2. openssl之BIO系列之20---缓冲(buffer)类型BIO
  3. linux环境下启动tomcat7出现时间过长(已经编译完成的项目)问题解决!
  4. HDU 1829/POJ 2492 A Bug&#39;s Life
  5. MATLAB 2013b .m 文件关联
  6. sdut oj 排队买饭
  7. Gym - 100676E —— 基础题
  8. wpf图片定点缩放
  9. Jquery Plugin模版
  10. IOS从背景图中取色