luoguP3292 [SCOI2016]幸运数字(倍增做法)
题意
线性基套上树上倍增即可,注意边界。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=20010;
int n,m,cnt,t;
int head[maxn],dep[maxn];
int f[maxn][20];
ll a[maxn];
struct edge{int to,nxt;}e[maxn<<1];
struct Xord
{
ll d[65];
Xord(){memset(d,0,sizeof(d));}
inline void insert(ll x)
{
for(int i=60;~i;i--)
{
if(!(x&(1ll<<i)))continue;
if(!d[i]){d[i]=x;return;}
else x^=d[i];
}
}
inline ll query()
{
ll res=0;
for(int i=60;~i;i--)res=max(res,res^d[i]);
return res;
}
}xord[maxn][20];
inline void add(int u,int v)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
}
void dfs(int x,int fa)
{
dep[x]=dep[fa]+1;
for(int i=1;i<=t;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
for(int j=0;j<=60;j++)xord[x][i].d[j]=xord[x][i-1].d[j];
for(int j=0;j<=60;j++)if(xord[f[x][i-1]][i-1].d[j])xord[x][i].insert(xord[f[x][i-1]][i-1].d[j]);
}
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(y==fa)continue;
f[y][0]=x;dfs(y,x);
}
}
inline ll query(int x,int y)
{
Xord res;
if(dep[x]>dep[y])swap(x,y);
for(int i=t;~i;i--)
if(dep[f[y][i]]>=dep[x])
{
for(int j=0;j<=60;j++)if(xord[y][i].d[j])res.insert(xord[y][i].d[j]);
y=f[y][i];
}
if(x==y)
{
res.insert(a[x]);
return res.query();
}
for(int i=t;~i;i--)
if(f[x][i]!=f[y][i])
{
for(int j=0;j<=60;j++)if(xord[x][i].d[j])res.insert(xord[x][i].d[j]);
for(int j=0;j<=60;j++)if(xord[y][i].d[j])res.insert(xord[y][i].d[j]);
x=f[x][i],y=f[y][i];
}
res.insert(a[x]),res.insert(a[y]),res.insert(a[f[x][0]]);
return res.query();
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
scanf("%d%d",&n,&m);t=(int)log2(n)+1;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),xord[i][0].insert(a[i]);
for(int i=1;i<n;i++)
{
int u,v;scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
for(int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y));
}
return 0;
}
luoguP3292 [SCOI2016]幸运数字(倍增做法)的更多相关文章
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- luoguP3292 [SCOI2016]幸运数字(点分治做法)
题意 考虑点分治,每次处理过重心的询问(即两点在重心的不同子树中). 求出每个点到重心的线性基,之后对过重心的询问合并两点线性基求解. code: #include<bits/stdc++.h& ...
- BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
随机推荐
- Day10 - Python基础10 socketserver 实现并发
本节内容: 1.实例tcp的并发 2.看源代码继承关系 3.详解:ThreadingTCPServer的过程 4.tcp和udp的request 不同 5.基于udp的并发实现 1.实例tcp并发 s ...
- poj 1064 Cable master 二分 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1064 题解 二分即可 其实 对于输入与精度计算不是很在行 老是被卡精度 后来学习了一个函数 floor 向负无穷取整 才能ac 代码如下 ...
- Where does Oracle SQL Developer store connections? oracle SQL Developer 连接信息保存的位置,什么地方
oracle SQL Developer 连接信息保存的位置,在什么地方? 在切换登录用户后,oracle SQL Developer 连接信息不见了.只要以前的用户信息还存在,可以在路径 C:\Us ...
- C语言的指针用法:输入一堆字符,把非字母的删去。
char *p,a[20]; int i; gets(a); //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a; //这个语句 ...
- hebust-fengyu
三人行必有我师焉,择其善者而从之,其不善者而改之. 入则无法家拂士,出则无敌国外患者,国恒亡,然后知生于忧患而死于安乐也. 狡兔死走狗烹,飞鸟尽良弓藏,敌国尽谋臣亡 今齐地方千里,百二十城,宫妇左右莫 ...
- linux五天光速入门
第一章: 01 Linux的安装及相关配置 → B站视频链接(p1-p21) 02 UNIX和Linux操作系统概述 → B站视频链接 第二章: 01 Linux命令及获取帮助 → B站视 ...
- C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
系列目录 [已更新最新开发文章,点击查看详细] 一个三维模型中可能包含对应多张二维图纸列表,本篇主要介绍如何获取模型文件对应的图纸列表. 请求地址:GET https://api.bimfac ...
- Java连载52-单例模式的缺点以及抽象类
一.单例模式 1.单例模式的缺点:单例模式的类型没有子类,无法被继承. 例如:下面的例子,由于父类的构造方法是私有的,所以子类中的构造方法是无法创建的,因为它是引用父类的构造方法 package co ...
- Redis缓存雪崩,缓存穿透,热点key解决方案和分析
缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...
- 安全NA第一天笔记:Firewall基本理论
防火墙的三种类型:<1>包过滤(packet filtering):也就是我们常用的访问控制列表(ACL)1.ACL类型:标准,扩展,命名,自反2.ACL其他特性:(1)重新排列序列号: ...