bzoj4568(合并线性基+倍增)
裸题练习模板
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=;
vector<ll>v[maxn][];
int d[maxn],n,Q,fa[maxn][],last[maxn],pre[maxn],other[maxn],t;
void add(int x,int y){++t;pre[t]=last[x];last[x]=t;other[t]=y;}
ll x,q[maxn];
vector<ll> uni(vector<ll> a,vector<ll> b){
vector<ll>ans;
int top=,lena=a.size(),lenb=b.size();
for(int i=;i<lena;++i)q[++top]=a[i];
for(int i=;i<lenb;++i)q[++top]=b[i];
int p=;
for(int j=;j>=;--j){
bool flag=;
for(int i=p+;i<=top;++i)
if((q[i]>>j)&){
swap(q[i],q[++p]);
flag=;break;
}
if(!flag)continue;
for(int i=;i<=top;++i)
if(i!=p){
if((q[i]>>j)&)q[i]^=q[p];
}
}
for(int i=;i<=p;++i)ans.push_back(q[i]);
return ans;
}
void dfs(int x){
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(v==fa[x][])continue;
d[v]=d[x]+;fa[v][]=x;
dfs(v);
}
}
int lca(int x,int y){
if(d[x]<d[y])swap(x,y);
for(int i=;i>=;--i)
if(d[fa[x][i]]>=d[y])x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;--i)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
}
int jump(int x,int y){
for(int i=;i>=;--i){
if((<<i)&y)x=fa[x][i];
}
return x;
}
vector<ll> qs(int x,int y){
int k=log2(d[x]-d[y]+);
return uni(v[x][k],v[jump(x,d[x]-d[y]+-(<<k))][k]);
}
int main(){
cin>>n>>Q;
for(int i=;i<=n;++i){
scanf("%lld",&x);
v[i][].push_back(x);
}
int a,b,tmp;
for(int i=;i<n;++i){
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
dfs();
for(int j=;j<=;++j)
for(int i=;i<=n;++i){
fa[i][j]=fa[fa[i][j-]][j-];
v[i][j]=uni(v[i][j-],v[fa[i][j-]][j-]);
}
while(Q--){
scanf("%d%d",&a,&b);
tmp=lca(a,b);
vector<ll>ans=uni(qs(a,tmp),qs(b,tmp));
ll res=,siz=ans.size();
for(int i=;i<siz;++i)
if((res^ans[i])>res)res^=ans[i];
printf("%lld\n",res);
}
return ;
}
bzoj4568(合并线性基+倍增)的更多相关文章
- P3292 [SCOI2016]幸运数字 [线性基+倍增]
线性基+倍增 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y) for ( ...
- BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增
[题目分析] 考虑异或的最大值,维护线性基就可以了. 但是有多次的询问,树剖或者倍增都可以. 想了想树剖动辄数百行的代码. 算了,我还是写倍增吧. 注:被位运算和大于号的优先级坑了一次,QaQ [代码 ...
- CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)
题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...
- 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
[bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...
- 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 238 Solved: 113[Submit][Status ...
- 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基
题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...
随机推荐
- 3D Math Keynote 2
[3D Math Keynote 2] 1.方向(diretion),指的是前方朝向.方位(orientation),指的是head.pitch.roll. 2.欧拉角的缺点: 1)给定方位的表达式不 ...
- linux 安装 mysql
二进制安装mysql 1,下载安装包,使用国内站点速度会比较快,如清华站点https://mirrors.tuna.tsinghua.edu.cn 登陆linux系统后,使用wget 进行下载mysq ...
- Celery 1
Celery是一个用Python开发的异步的分布式任务调度模块 Celery有以下优点: 简单:一但熟悉了celery的工作流程后,配置和使用还是比较简单的 高可用:当任务执行失败或执行过程中发生连接 ...
- 思科模拟器GNS3-2.1.8安装笔记 (适用于版本2.0.3以上的GNS3)
当前现阶段学习经常使用的路由交换设备主要来自于思科.华为和华三三家,这三家的设备操作配置大致类似,却又不尽相同.因为实体设备通常都非常昂贵,所以作为学习,我们通常会使用它们提供的模拟器.华为的模拟器是 ...
- route的简单使用
route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] add : 添加一条路由规则del : 删除一条路由规则-net ...
- VS code 代码格式整理的配置
{ "workbench.iconTheme": "material-icon-theme", "vetur.validation.template& ...
- swift 自动布局设置 tableview 的 tableHeaderView 的高度
class headerView: UIView { var whiteView = UIView().then { $.backgroundColor = UIColor.red } overrid ...
- 编辑gif
在撰写文档的过程中,为了清晰的表述我们的内容经常会加入一些图片.对于 `.jpg` 或 `.png` 的静态图我们可以直接 使用windows自带的照片编辑器编辑即可.对于如 licecap 录制出来 ...
- Isight 命令行运行任务
说明书参考:https://abaqus-docs.mit.edu/2017/English/DSSIMULIA_Established.htm 不一定对版本.但是大部分还可以. 不对的可以在命令里敲 ...
- win10在Pycharm中安装scrapy
查看官网说明 发现推荐是安装Anaconda 或 Miniconda,这东西有点大而全,感觉目前用不上.所以没这样做. 直接安装scrapy 如果直接装会报错的,参考文章就可以解决. 这里记一下组件下 ...