【 [SCOI2016]幸运数字】
想法
倍增加上线性基就行惹
线性基的合并可以通过把一个线性基的元素插入到另一个里实现
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 20005
#define M 40005
ll cnt,v[N],G[N][21][62],head[N],dep[N];
ll fa[N][21],ans[62];
struct P{
int to,next;
}e[M];
void add(int x,int y){
e[++cnt].to = y;
e[cnt].next = head[x];
head[x] = cnt;
}
void insert(ll *a,ll val){
for(int i = 61;i >= 0;--i){
if((val >> i) & 1){
if(!a[i]){
a[i] = val;
break;
}
val ^= a[i];
}
}
}
void Merge(ll *a,ll *b){
for(int i = 61;i >= 0;--i){
if(b[i])
insert(a,b[i]);
}
}
void dfs(ll u,ll f){
fa[u][0] = f;
dep[u] = dep[f] + 1;
for(int i = head[u];i;i = e[i].next){
ll v = e[i].to;
if(v == f)
continue;
dfs(v,u);
}
}
ll n,q;
void getlca(){
for(int j = 1;j <= 20;++j)
for(int i = 1;i <= n;++i){
fa[i][j] = fa[fa[i][j - 1]][j - 1];
std::memcpy(G[i][j],G[i][j - 1],sizeof(G[i][j - 1]));
Merge(G[i][j],G[fa[i][j - 1]][j - 1]);
}
}
void lca(ll x,ll y){
if(dep[x] < dep[y])
std::swap(x,y);
for(int i = 20;i >= 0;--i){
if(dep[fa[x][i]] >= dep[y]){
Merge(ans,G[x][i]);
x = fa[x][i];
}
}
if(x == y){
Merge(ans,G[x][0]);
return;
}
for(int i = 20;i >= 0;--i){
if(fa[x][i] != fa[y][i]){
Merge(ans,G[x][i]);
Merge(ans,G[y][i]);
x = fa[x][i];
y = fa[y][i];
}
}
Merge(ans,G[x][0]),Merge(ans,G[y][0]),Merge(ans,G[fa[x][0]][0]);
return;
}
inline ll read(){
ll ans = 0,f = 1;
char a = getchar();
while(a < '0' && a > '9' && (a != '-'))
a = getchar();
if(a == '-')
f = -1,a = getchar();
while(a <= '9' && a >= '0'){
ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
}
return ans * f;
}
int main(){
n = read(),q = read();
for(int i = 1;i <= n;++i)
insert(G[i][0],read());
for(int i = 1;i <= n - 1;++i){
ll x = read(),y = read();
add(x,y);
add(y,x);
}
dfs(1,0);
getlca();
for(int i = 1;i <= q;++i){
ll u = read(),v = read();
std::memset(ans,0,sizeof(ans));
lca(u,v);
ll sum = 0;
for(int i = 61;i >= 0;--i){
if(ans[i])
sum = std::max(sum,sum ^ (ans[i]));
}
std::cout<<sum<<std::endl;
}
}
【 [SCOI2016]幸运数字】的更多相关文章
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- [SCOI2016]幸运数字 树链剖分,线性基
[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- [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 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
随机推荐
- SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...
- 单片机STM32的启动文件详解--学习笔记
启动文件简介 启动文件由汇编编写,是系统上电复位后第一个执行的程序.主要做了以下工作: 1.初始化堆栈指针SP=_initial_sp 2.初始化PC 指针=Reset_Handler 3.初始化中断 ...
- i love dingning
"如果你爱一个人,不是下课给人家买买水,不是短信发来发去,也不是周末一起出来唱唱歌聊聊天吃吃饭,而是做一个出色的人.以后的以后,可能还有别的人爱她,你要做的,是把别人都比下去.你要变得优秀, ...
- ubuntu图标
linux桌面图标跟windows系统一样,只是个快捷方式,在/usr/share/applications/目录下面有应用程序的启动图标,可以直接复制到桌面,如果这个文件夹下没有的话,可以自己新建一 ...
- Android ANR从原理到日志分析,记下来就够了
站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...
- 常见yaml写法-deployment
apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata: name: cango-demo #Deployment名称 ...
- Python基础(普通函数及参数)
# def my_abs(x): # if not isinstance(x,(int,float)):#参数类型做检查,只允许整数和浮点数类型的参数.数据类型检查可以用内置函数isinstance( ...
- 一个简单的golang项目,实验 gitlab-ci-cd Pipelines
至少两台主机,gitlab + gitlab-runner gitlab + gitlab-runner安装略 项目源码:https://gitee.com/M27149/testgo.git 在自建 ...
- .net工程师学习vue的心路历程(三)
vue cli3没记错的话是在2019年8月份yyx个人正式声明发布. 接下来就开始我们的vue cli3的方式创建vue项目.明白一点,vue cli3遵循的一个原则就是 "0配置&quo ...
- Eclipse使用JDBC方式连接SQLServer2008
JDBC_连接数据库一.配置 (一) 通过SQL Server配置管理器配置相关部分: 右键点击,启动tcp/ip协议右键点击属性查看自己的TCP端口号,记住,后面会用到右键点击SQL Server ...