树的点分治,每次求出重心后,求出重心到每个点路径上的数的线性基。

对于每个询问,只需要暴力合并两个线性基即可。

时间复杂度$O(60n\log n+60^2q)$。

#include<cstdio>
typedef long long ll;
const int N=20010,M=200010,E=M*30;
int n,m,i,x,y,g[N],v[N<<1],nxt[N<<1],ok[N<<1],ed;
int all,f[N],son[N],now,pos[N];
int G[N],V[E],NXT[E],ED,p[M],cnt;
ll a[N],ans[M];
struct Q{int x,y;}q[M];
struct B{ll a[60];B(){for(int i=0;i<60;i++)a[i]=0;}inline void ins(ll x){for(int i=59;~i;i--)if(x>>i&1){if(a[i])x^=a[i];else{a[i]=x;break;}}}inline ll ask(){ll t=0;for(int i=59;~i;i--)if((t^a[i])>t)t^=a[i];return t;}
}h[N],b;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];ok[ed]=1;g[x]=ed;}
inline void ADD(int x,int y){V[++ED]=y;NXT[ED]=G[x];G[x]=ED;}
void findroot(int x,int y){son[x]=1;f[x]=0;for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){findroot(v[i],x);son[x]+=son[v[i]];if(son[v[i]]>f[x])f[x]=son[v[i]];}if(all-son[x]>f[x])f[x]=all-son[x];if(f[x]<f[now])now=x;
}
void dfs(int x,int y,int z){pos[x]=z;h[x]=h[y];h[x].ins(a[x]);for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y)dfs(v[i],x,z);
}
void solve(int x){if(!G[x])return;f[0]=all=son[x],findroot(x,now=0);int i;pos[now]=now;h[now]=B();h[now].ins(a[now]);for(i=g[now];i;i=nxt[i])if(ok[i])dfs(v[i],now,v[i]);for(cnt=0,i=G[x];i;i=NXT[i])p[++cnt]=V[i];G[x]=0;for(i=1;i<=cnt;i++)if(pos[q[p[i]].x]==pos[q[p[i]].y])ADD(pos[q[p[i]].x],p[i]);else{b=h[q[p[i]].x];B*y=h+q[p[i]].y;for(int j=59;~j;j--)if(y->a[j])b.ins(y->a[j]);ans[p[i]]=b.ask();}for(i=g[now];i;i=nxt[i])if(ok[i])ok[i^1]=0,solve(v[i]);
}
int main(){read(n),read(m);for(ed=i=1;i<=n;i++)read(a[i]);for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);for(i=1;i<=m;i++){read(q[i].x),read(q[i].y);if(q[i].x==q[i].y)ans[i]=a[q[i].x];else ADD(1,i);}son[1]=n;solve(1);for(i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

  

BZOJ4568 : [Scoi2016]幸运数字相关推荐

  1. Bzoj4568: [Scoi2016]幸运数字

    Bzoj4568: [Scoi2016]幸运数字 线性基+倍增+LCA 原来线性基还能这么考--一开始看到这个题以为是树上差分线性基,然而线性基不支持删除,所以就挂了. 后来想到倍增线性基,其实到这里 ...

  2. BZOJ4568 [Scoi2016]幸运数字

    BZOJ4568 [Scoi2016]幸运数字 题目描述 传送门 题目分析 这个题,求树上链的\(XOR\)最大值,可以不选某些点. 考虑到线性基可以用很快的速度求出\(XOR\)的最大值,我们首先可 ...

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

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

  4. [bzoj4568][Scoi2016]幸运数字

    来自FallDream的博客,未经允许,请勿转载,谢谢. A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这 ...

  5. BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)

    题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...

  6. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)

    P3292 [SCOI2016]幸运数字 思路 如果这题是求x,yx, yx,y之间的距离显然我们可以通过树剖加线段树来写, 但是这里变成了求任意个数的异或最大值.如果给定区间我们显然可以通过线性基来 ...

  7. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  8. bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 1692  Solved: 643 [Submit][Sta ...

  9. BZOJ4568:[SCOI2016]幸运数字——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4568 https://www.luogu.org/problemnew/show/P3292 A ...

最新文章

  1. [Python学习笔记]h5py入门讲解
  2. Spring Boot(一)—— Spring Boot 入门
  3. 去掉登陆下的“扫一扫,访问微社区
  4. 一步步编写操作系统 46 linux的elf可执行文件格式1
  5. Flutter高内聚组件怎么做?阿里闲鱼打造开源高效方案!
  6. 诗与远方:无题(七)
  7. finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
  8. potplayer连续播放视频时保持原有屏幕大小不变
  9. AcWing 674.超级2048
  10. 修改tomcat默认端口号
  11. 8uftp cuteftp,8uftp cuteftp之间的差别
  12. 移动手机号神州行去香港购买境外流量包方法和注意事项
  13. 计算机桌面计算机快捷方式不见,桌面快捷方式不见了,教您桌面快捷方式不见了怎么办...
  14. TPA6100A2DGKR立体声音频功率放大器
  15. 数字人民币的基础-共识与信任
  16. element表格实现折叠效果
  17. 联想服务器u潘安装linux,联想拯救者R7000如何设置U盘启动安装linux系统?
  18. 【从0到1搭建LoRa物联网】10、LoRa终端ASR6505 ADC采样
  19. 初步浅谈 celery
  20. android avb2.0问题解答 汇总

热门文章

  1. PowerDesigner16.5安装
  2. 白盒-CNN纹理深度可视化: 使用MIT Place 场景预训练模型
  3. Ubuntu win8 小设备版本
  4. android 下滑,Android实现下滑和上滑事件
  5. SpringBoot系列: 使用 flyway 管理数据库版本
  6. 红外摄像机的功率究竟有多大
  7. Ubuntu 16.04编译安装OpenCV(Python)
  8. 黄聪:PowerPoint设计编辑动画的时候图层隐藏和显示问题
  9. 谈谈:.Net中的序列化和反序列化
  10. 关于购买企业邮箱,谨防陷入几大误区