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\)条重链,每条重链 ...
随机推荐
- vmware虚拟机开机报附件中的错误的解决办法
Virtualized Inter VT-x/EPT is incompatible with this virtual machine configuration 在没有虚拟化msg.inter.h ...
- Windows Python 2.7环境搭建
一.安装及修改环境变量 我安装的版本是python-2.7.15.amd64,因为2.7.9之后的版本都会安装好pip.将Python执行文件所在文件夹加入path路径,C:\Python27.将pi ...
- git 查询某人的提交记录
git log --author=liubo --name-only
- dedecms图片上传函数
/** * 图片上传类 * @param $file上传图片信息 * @param $ty */ function upload_pic($file, $ty) { if (!is_uploaded_ ...
- [Training Video - 4] [Selenium IDE]
Selenium IDE Training List
- [SoapUI]怎样获取上一个Test Step的名字
def currentStepInd = context.currentStepIndex def previousStep = testRunner.testCase.getTestStepAt(c ...
- Spring MVC之RequestMappingHandlerAdapter初始化
RequestMappingHandlerAdapter基于注解的处理器适配器,目的是用来执行handler,同时返回modelAndView给前端控制器,这块个人感觉是spring mvc的核心了, ...
- Dom4j入门
一.Dom4j API生成xml文件 @Test public void bulidXmlByDom4j(){ //创建document对象 Document document = DocumentH ...
- [C#] == VS Equals
声明:本篇博客翻译自:https://www.codeproject.com/Articles/1111680/equalsequals-VS-Equals-in-Csharp 由于水平(技术水平+英 ...
- jquery对属性和特性的操作
attribute(特性)和property(属性)是两个不同的概念.attribute表示HTML文档节点的特性,property表示DOM元素的属性 这些属性例如selectedIndex, ta ...