【题目分析】

考虑异或的最大值,维护线性基就可以了。

但是有多次的询问,树剖或者倍增都可以。

想了想树剖动辄数百行的代码。

算了,我还是写倍增吧。

注:被位运算和大于号的优先级坑了一次,QaQ

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> #include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue> using namespace std; #define ll long long
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 20005
#define mlog 20
#define mxle 64
#define mxed 50005 int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} ll Getll()
{
ll x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
} struct Base{
ll lb[mxle];
void add(ll x)
{
D(i,63,0)
{
if ((x>>i)&1)
{
if (!lb[i]) {lb[i]=x;break;}
else x^=lb[i];
}
}
}
void init(ll x){memset(lb,0,sizeof lb);add(x);}
}; Base add(Base x,Base y)
{
Base ret=x;
F(i,0,63) if (y.lb[i]) ret.add(y.lb[i]);
return ret;
} int f[maxn][mlog],n,q,h[mxed],to[mxed],ne[mxed],en=0,dst[maxn];
Base g[maxn][mlog]; void add(int a,int b)
{
to[en]=b; ne[en]=h[a]; h[a]=en++;
to[en]=a; ne[en]=h[b]; h[b]=en++;
} void dfs(int o)
{
for (int i=h[o];i>=0;i=ne[i])
if (f[o][0]!=to[i])
{
f[to[i]][0]=o;
dst[to[i]]=dst[o]+1;
dfs(to[i]);
}
} ll query(Base x)
{
ll sum=0;
D(i,63,0)
if ((x.lb[i]^sum)>sum) sum^=x.lb[i];
return sum;
} ll ask(int a,int b)
{
if (dst[a]<dst[b]) swap(a,b);
Base ret;ret.init(0);
int dist=dst[a]-dst[b];
D(i,mlog-1,0)
if ((dist>>i)&1)
{
ret=add(ret,g[a][i]);
a=f[a][i];
}
if (a==b)
{
ret=add(ret,g[a][0]);
return query(ret);
}
D(i,mlog-1,0)
if (f[a][i]!=f[b][i])
{
ret=add(ret,g[a][i]);
ret=add(ret,g[b][i]);
a=f[a][i];b=f[b][i];
}
ret=add(ret,g[a][1]);
ret=add(ret,g[b][0]);
return query(ret);
} int main()
{
Finout();
memset(h,-1,sizeof h);
n=Getint(); q=Getint();
F(i,1,n) g[i][0].init(Getll());
F(i,1,n-1) add(Getint(),Getint());
dfs(1);
F(i,1,mlog-1)
F(j,1,n)
{
f[j][i]=f[f[j][i-1]][i-1];
g[j][i]=add(g[j][i-1],g[f[j][i-1]][i-1]);
}
F(i,1,q) printf("%lld\n",ask(Getint(),Getint()));
}

  

最新文章

  1. 我的前端故事----Ajax方式和jsonp的实现区别
  2. Servlet解决参数乱码问题
  3. U-boot中的FDT
  4. 使用开源免费类库在.net中操作Excel
  5. [Codeforces] Round #320 (Div.2)
  6. cdecl和stdcall调用约定-汇编演示
  7. js和css内联外联注意事项
  8. linux目录权限小记
  9. QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)
  10. 搜索广告与广告网络Demand技术-探索与利用
  11. Javascript中的浅拷贝和深拷贝
  12. swift之函数式编程(四)
  13. 01-java前言、入门程序、变量、常量
  14. ARouter基础使用(一)
  15. axure--轮播图
  16. http://ctf.bugku.com/challenges#Mountain%20climbing:bugku--Mountain-Climbing
  17. (7)路由层的分发(不同app各自管理自己的和app的注册)
  18. jdom解析xml
  19. leaflet-velocity 参数
  20. TextView中文文档

热门文章

  1. calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别
  2. 如何使用Git Bash Here,将本地项目传到github上
  3. jquery插件serializeFormToObject
  4. Pacman常用命令 文内搜索吧
  5. VS打包软件部署------ClickOnce应用安装 (各版本.net引导文件安装,再发布文档离线安装下载地址)
  6. BXS入门赛部分writeup
  7. javaEE(12)_数据库连接池
  8. javaEE(9)_在线支付
  9. 使用一位数组解决 1 1 2 3 5 8 13 数列问题 斐波纳契数列 Fibonacci
  10. CS193p Lecture 7 - Views, Gestures