P3292 [SCOI2016]幸运数字
题目链接
题意分析
一句话题意 : 树上一条链中挑选出某些数 异或和最大
我们可以考虑维护一个树上倍增线性基
然后倍增的时候 维护一个线性基合并就可以了
写起来还是比较容易的
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 200008
#define IL inline
#define M 66
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,m,tot;
int to[N<<1],nex[N<<1],head[N];
int dep[N],fath[N][20];
ll num[N],ans[M],key[N][20][M];
IL void add(int x,int y)
{to[++tot]=y;nex[tot]=head[x];head[x]=tot;}
IL void insert(ll *x,ll y)
{
for(R int i=61;i>=0;--i)
{
ll now=(1ll<<i);
if(now&y)
{
if(!x[i]) {x[i]=y;break;}
y^=x[i];
}
}
}
IL void merge(ll *cdy,ll *wzy)
{
for(R int i=61;i>=0;--i) if(cdy[i]) insert(wzy,cdy[i]);
}
IL ll qury_ans()
{
ll res=0;
for(R int i=61;i>=0;--i)
if((res^ans[i])>res) res^=ans[i];
return res;
}
IL void dfs(int now,int fat)
{
fath[now][0]=fat;dep[now]=dep[fat]+1;
insert(key[now][0],num[now]);
for(R int i=1;(1<<i)<=dep[now];++i)
{//倍增 + 合并线性基
fath[now][i]=fath[fath[now][i-1]][i-1];
merge(key[now][i-1],key[now][i]);
merge(key[fath[now][i-1]][i-1],key[now][i]);
}
for(R int i=head[now];i;i=nex[i])
{
int v=to[i];
if(v==fat) continue;
dfs(v,now);
}
}
IL ll qury_LCA(int nowx,int nowy)
{//倍增 + 维护答案线性基
memset(ans,0,sizeof ans);
if(dep[nowx]<dep[nowy]) swap(nowx,nowy);
for(R int i=19;i>=0;--i)
{
if(dep[fath[nowx][i]]>=dep[nowy])
{
merge(key[nowx][i],ans);
nowx=fath[nowx][i];
}
}
if(nowx==nowy)
{
insert(ans,num[nowx]);
// insert(ans,num[nowx]);
// insert(ans,num[fath[nowx][0]]);
return qury_ans();
}
for(R int i=19;i>=0;--i)
{
if(fath[nowx][i]!=fath[nowy][i])
{
merge(key[nowx][i],ans);
merge(key[nowy][i],ans);
nowx=fath[nowx][i];nowy=fath[nowy][i];
}
}
insert(ans,num[nowx]);
insert(ans,num[nowy]);
insert(ans,num[fath[nowx][0]]);
// insert(ans,num[nowx]);
// insert(ans,num[fath[nowx][0]]);
// insert(ans,num[nowy]);
// insert(ans,num[fath[nowy][0]]);
return qury_ans();
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);read(m);
for(R int i=1;i<=n;++i) read(num[i]);
for(R int i=1,x,y;i<n;++i)
{
read(x);read(y);
add(x,y);add(y,x);
}
dfs(1,0);
while(m--)
{
int x,y;
read(x);read(y);
printf("%lld\n",qury_LCA(x,y));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
P3292 [SCOI2016]幸运数字的更多相关文章
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 洛谷P3292 [SCOI2016] 幸运数字 [线性基,倍增]
题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...
- P3292 [SCOI2016]幸运数字 线性基
正解:线性基+倍增 解题报告: 先放下传送门QAQ 然后这题,其实没什么太大的技术含量,,,?就几个知识点套在一起,除了代码长以外没任何意义,主要因为想复习下线性基的题目所以还是写下,,, 随便写下思 ...
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧…… 打了一发……A了? 所以这真的是个暴力倍增LCA合并线性基么…… ps:据某大佬说其实可以离线之后 ...
- P3292 [SCOI2016]幸运数字 [线性基+倍增]
线性基+倍增 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y) for ( ...
- 【 [SCOI2016]幸运数字】
P3292 [SCOI2016]幸运数字 想法 倍增加上线性基就行惹 线性基的合并可以通过把一个线性基的元素插入到另一个里实现 #include<iostream> #include< ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- [SCOI2016]幸运数字 树链剖分,线性基
[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...
随机推荐
- MD5加密算法原理及其应用
MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...
- Redis数据结构(三)
Redis五种数据类型: (1)字符串 (2)字符串列表 (3)有序字符串集合 (4)哈希 (5)字符串集合 其中(4)(5)应用最多. key命名的注意: (1)不要过长,尽量不要超过1024,会降 ...
- 续安装好composer和workerman之后;TP5运行workerman的操作
TP5想要实现时时通讯:首先先安装好composer和workerman,我之前有写一篇安装的方法,在cmd里面安装:tp5手册上面有写cmd命令的代码:接下来是安装好后如何运行的: 首先在项目中建立 ...
- 如何用Word发布WordPress博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- Ian Goodfellow——对抗神经网络之父
争议.流派,有关GAN的一切:Ian Goodfellow Q&A:https://baijiahao.baidu.com/s?id=1595081179447191755&wfr=s ...
- Linux的进程/线程间通信方式总结
Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...
- 软件工程:java实现wordcount基本功能
github链接:https://github.com/Nancy0611/wc 一:项目相关要求 该项目能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功 ...
- Android-Activity启动模式-应用场景
在上一篇博客中,Android-Activity启动模式(launchMode),就介绍了Activity四种启动模式的特点与使用等,但是到底什么样子的场景,去使用什么样子的启动模式呢 Activit ...
- [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法
在CentOS环境下编译CPP时报出 undefined reference to `__gxx_personality_v0' collect2: ld 以上错误,调查了一下,加上参数[-lstdc ...
- ffmpeg学习(一)——在window7下编译ffmpeg
FFmpeg是一个开源免费跨平台的视频和音频流项目,它提供了录制.转换以及流化音视频的完整解决方案.本文作者将尝试使用该库实现一个可适应复杂网络环境的, 支持标准rtsp协议的流媒体服务器.由于Vis ...