【题目分析】

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

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

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

算了,我还是写倍增吧。

注:被位运算和大于号的优先级坑了一次,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()));
}

  

BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增的更多相关文章

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

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

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

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

  3. P3292 [SCOI2016]幸运数字 [线性基+倍增]

    线性基+倍增 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y) for ( ...

  4. BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)

    题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...

  5. BZOJ.4516.[SCOI2016]幸运数字(线性基 点分治)

    题目链接 线性基可以\(O(log^2)\)暴力合并.又是树上路径问题,考虑点分治. 对于每个点i求解 LCA(u,v)==i 时的询问(u,v),只需求出这个点到其它点的线性基后,暴力合并. LCA ...

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

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

  7. P3292 [SCOI2016]幸运数字 线性基

    正解:线性基+倍增 解题报告: 先放下传送门QAQ 然后这题,其实没什么太大的技术含量,,,?就几个知识点套在一起,除了代码长以外没任何意义,主要因为想复习下线性基的题目所以还是写下,,, 随便写下思 ...

  8. BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...

  9. BZOJ 4568 [Scoi2016]幸运数字(树链剖分 + 异或线性基)

    题目链接  BZOJ 4568 考虑树链剖分+线段树维护每一段区域的异或线性基 对于每个询问,求出该点集的异或线性基.然后求一下这个线性基里面能异或出的最大值即可. #include <bits ...

随机推荐

  1. Selenium私房菜系列9 -- Selenium RC服务器命令行参数列表【ZZ】

    本文转载自:http://wiki.javascud.org/display/SEL/Selenium+Remote+Control+-+options 使用示例: java -jar seleniu ...

  2. Azure School女神相邀,把每分钟都过的更充实

    也许你不姓「牛」,但是你技术牛啊 所以,请容我叫你一声「牛郎」 (讲真,只是因为你技术牛,不是其他啥原因哈) 平时忙到昏天黑地,一心一意为技术的你 注意看一下日历,因为: !!!七夕节(8月28日)到 ...

  3. cocoapods学习

    1.安装 http://stackoverflow.com/questions/16459028/rvm-install-error-running-requirements-osx-port-ins ...

  4. The Django Book 第三章 试图和URL配置

    之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...

  5. (七)VMware Harbor 问题:Get https://192.168.3.135:8088/v2/: http:server gave HTTP response to HTTPS client

    (一)问题描述 登陆时,报错 docker Get https://192.168.3.135:8088/v2/: http:server gave HTTP response to HTTPS cl ...

  6. js 控制台输出

    var a = 'string'; var b = 123; console.log("The %s jumped over %d tall buildings", a, b); ...

  7. PDO drivers no value 解决办法

    我的服务器是windos系统的,而且我也已经开启了PDO扩展,但是查看phpinfo的时候,结果却如下图: 解决办法 修改 php.ini 中的 extension_dir 路径即可! 将extens ...

  8. Python基础篇 -- 部分练习题

    实现一个整数加法计算器(两个数相加): 如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算 ...

  9. orcal中创建和删除表空间和用户

    1.创建表空间 create tablespace NW_DATA logging datafile 'F:\oracle\product\10.2.0\oradata\nwdb\NW_DATA.db ...

  10. Bootsrtap 面包屑导航(Breadcrums)

    Bootstrap面包屑导航是一种基于网站层次信息显示的方式.以博客为例,面包屑导航可以显示发布日期,类别或标签,它们表示当前页面在导航层次结构内的位置. Bootstrap面包屑导航其实是一个简单的 ...