首先第一眼是一个倍增套线性基,但是$O(Qlog^2Vlog^N)=10^{10}$的复杂度...

即使是st表也只是变成了$O(Nlog^2Vlog^N)$啊

考虑点分治,相对于倍增显著减少了线性基合并(一个往另一个里暴力插)这一O(log^2V)的过程

就是在分治到一个询问的两端点分立于两个子树的时候,合并它们的线性基来统计答案

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=2e4+,maxq=2e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int b,i;
};
int N,Q,siz[maxn];
vector<Node> q[maxn];
int eg[maxn*][],egh[maxn],ect;
bool flag[maxn];
ll base[maxn][],tmp[],val[maxn],ans[maxq];
int son[maxn],sct,bel[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a],egh[a]=ect;
}
inline void getroot(int x,int f,int ssiz,int &rt,int &sm){
siz[x]=;int m=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
getroot(b,x,ssiz,rt,sm);
m=max(siz[b],m);siz[x]+=siz[b];
}m=max(ssiz-siz[x],m);
if(m<sm) rt=x,sm=m;
} inline void update(ll *bs,ll v){
for(int i=;i>=;i--){
if(v&(1ll<<i)){
if(!bs[i]){bs[i]=v;break;}
else v^=bs[i];
}
}
} inline ll query(ll *bs,ll v){
for(int i=;i>=;i--){
if((v^bs[i])>v) v^=bs[i];
}return v;
} inline void getbase(int x,int f){
update(base[x],val[x]);
son[++sct]=x;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
memcpy(base[b],base[x],sizeof(base[x]));
getbase(b,x);
}
} inline void solve(int x,int ssiz){
flag[x]=;bel[x]=x;CLR(base[x],);
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(flag[b]) continue;
CLR(base[b],);sct=;
getbase(b,);
for(int i=;i<=sct;i++){
int y=son[i];
for(int j=;j<q[y].size();j++){
int b=q[y][j].b;
if(bel[b]!=x) continue;
memcpy(tmp,base[y],sizeof(tmp));
for(int k=;k<=;k++){
if(base[b][k]) update(tmp,base[b][k]);
}
ans[q[y][j].i]=max(query(tmp,),query(tmp,val[x]));
}
}
for(int i=;i<=sct;i++) bel[son[i]]=x;
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(flag[b]) continue;
int rt,sm=1e9;
getroot(b,,siz[b]>siz[x]?ssiz-siz[x]:siz[b],rt,sm);
solve(rt,siz[b]>siz[x]?ssiz-siz[x]:siz[b]);
}
} int main(){
int i,j,k;
N=rd(),Q=rd();
for(i=;i<=N;i++) val[i]=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}
for(i=;i<=Q;i++){
int a=rd(),b=rd();
if(a==b) ans[i]=val[a];
else{
q[a].push_back((Node){b,i});
q[b].push_back((Node){a,i});
} }
int rt,sm=1e9;
getroot(,,N,rt,sm);
solve(rt,N);
for(i=;i<=Q;i++)
printf("%lld\n",ans[i]);
return ;
}

luogu3292 幸运数字 (点分治+线性基)的更多相关文章

  1. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  2. 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...

  3. 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧…… 打了一发……A了? 所以这真的是个暴力倍增LCA合并线性基么…… ps:据某大佬说其实可以离线之后 ...

  4. SCOI2016幸运数字(树剖/倍增/点分治+线性基)

    题目链接 loj luogu 题意 求树上路径最大点权异或和 自然想到(维护树上路径)+ (维护最大异或和) 那么有三种方法可以选择 1.树剖+线性基 2.倍增+线性基 3.点分治+线性基 至于线性基 ...

  5. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  6. $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基

    正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...

  7. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2131  Solved: 865[Submit][Statu ...

  8. BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】

    题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...

  9. 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基

    4184: shallot Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 356  Solved: 180[Submit][Status][Discu ...

随机推荐

  1. jdk下载及环境变量配置

    一.下载 下载链接 二.环境变量:

  2. 4.请介绍一下c++和Java的区别

    1.指针 2.c++多重继承,Java只能继承一个父类,但是可以继承多个接口 3.数据类型及类,Java完全面向对象,所有函数和变量都必须是类的一部分.而c++允许将函数和变量定义为全局,Java取消 ...

  3. 转:win7下git凭据导致无法clone代码

    win7下存在一个凭据管理的情况,如果旧凭据没有删除,用新账户是无法clone代码的. https://blog.csdn.net/qq_34665539/article/details/804082 ...

  4. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  5. RBAC模型

    1.RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...

  6. python之路--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  7. git ignore 忽略 idea文件

    下载了项目组的代码之后发现,一个问题,一编译就生成了很多的 .idea文件夹 还有 target文件夹,这些是不需要提交到git上的, 需要提交的时候屏蔽一下,所以需要建立一个ignore文件列表把他 ...

  8. DELPHI中MDI子窗口的关闭 和打开

    Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭.解决办法是在子窗口的OnClose事件处理过程中加入如 ...

  9. 三、zookeeper安装

    一.简介 二.下载解压: #wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar ...

  10. mvc学习过程碰到问题

    Fluent API配置 单例模式+Autofac 批量注入