首先第一眼是一个倍增套线性基,但是$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. tailf、tail -f、tail -F三者区别(转)

    tail -f    等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F     等同于--follow=name  --retry,根 ...

  2. MySQL数据性能优化-修改方法与步骤

    原文:http://bbs.landingbj.com/t-0-240421-1.html 数据库优化应该是每个设计到数据库操作应用必须涉及到的操作. 经常调试修改数据库性能主要有三个方面 1.MyS ...

  3. 为什么说Java中只有值传递(转载)

    出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...

  4. day 7-20 视图,触发器,事务

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  5. Prism框架研究(二)

    首先在介绍本节内容之前,首先来看看官方文档来如何描述Prism 应用的初始化吧!A Prism application requires registration and configuration ...

  6. 打包一个UWP APP

    Before packaging your app Test your app. Before you package your app for store submission, make sure ...

  7. codeforces158C

    Cd and pwd commands CodeForces - 158C Vasya is writing an operating system shell, and it should have ...

  8. if 结构语句

    if 条件: print()#不只是能输入print

  9. django---一对多和多对多字段的操作训练

    建表准备: django项目models.py建表 from django.db import models class Myclass(models.Model): cname = models.C ...

  10. BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP

    题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...