题目


分析

题目就是将\(x\)到\(y\)路径上的线性基合并求解,

这里用的是点分治,每次换根到重心的时候维护前缀线性基,

查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
typedef long long lll; const int N=20011,M=200011;
struct node{int y,next;}e[N<<1],E[M<<1];
int n,siz[N],big[N],as[N],SIZ,et=1,Et=1,tot,Q;
int v[N],root,b[N],is_ed[M],hs[N],st[N]; long long a[N],ans[M];
inline lll iut(){
rr lll ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Vector_Space{
lll re[61];
inline void BUILD(){
memset(re,0,sizeof(re));
}
inline void Insert(lll x){
for (rr int i=60;~i;--i)
if ((x>>i)&1){
if (!re[i]) {re[i]=x; return;}
x^=re[i];
}
}
inline lll query(lll x){
for (rr int i=60;~i;--i)
if ((x^re[i])>x) x^=re[i];
return x;
}
}H[N];
inline Vector_Space comb(Vector_Space A,Vector_Space B){
rr Vector_Space C; C=A;
for (rr int i=60;~i;--i) C.Insert(B.re[i]);
return C;
}
inline signed max(int a,int b){return a>b?a:b;}
inline void dfs(int x,int fa){
siz[x]=1,big[x]=0;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa&&!v[e[i].y]){
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
big[x]=max(big[x],siz[e[i].y]);
}
big[x]=max(big[x],SIZ-siz[x]);
if (big[x]<big[root]) root=x;
}
inline void Get(int x,int fa,int bel){
st[++tot]=x,b[x]=bel,H[x]=H[fa],H[x].Insert(a[x]);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]&&e[i].y!=fa) Get(e[i].y,x,bel);
}
inline void calc(int x){
st[tot=1]=b[x]=x,H[x].BUILD(),H[x].Insert(a[x]);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]) Get(e[i].y,x,e[i].y);
for (rr int i=1;i<=tot;++i)
for (rr int j=hs[st[i]];j;j=E[j].next)
if (!is_ed[j>>1]&&(b[st[i]]^b[E[j].y]))
is_ed[j>>1]=1,ans[j>>1]=comb(H[st[i]],H[E[j].y]).query(0);
}
inline void dp(int x){
v[x]=1,calc(x);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]){
big[0]=SIZ=siz[e[i].y];
dfs(e[i].y,root=0),dp(root);
}
}
signed main(){
n=iut(),Q=iut();
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
for (rr int i=1;i<=Q;++i){
rr int x=iut(),y=iut();
if (x==y) ans[i]=a[x],is_ed[i]=1;
E[++Et]=(node){y,hs[x]},hs[x]=Et;
E[++Et]=(node){x,hs[y]},hs[y]=Et;
}
big[0]=SIZ=n,dfs(1,root=0),dp(root);
for (rr int i=1;i<=Q;++i)
print(ans[i]),putchar(10);
return 0;
}

#线性基,点分治#洛谷 3292 [SCOI2016]幸运数字的更多相关文章

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

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

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

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

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

    题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...

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

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

  5. Luogu 3292 [SCOI2016]幸运数字

    BZOJ 4568. 感觉很板. 前置技能:线性基.      放一篇感觉讲的比较丰富的博客: 戳这里. 首先要求在一个序列中任意选点使得异或和最大,当然是想到线性基了. 把问题转换到树上,如果每次询 ...

  6. [洛谷P2567] SCOI2010 幸运数字

    问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...

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

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

  8. BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]

    4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...

  9. [SCOI2016]幸运数字 树链剖分,线性基

    [SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...

  10. 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)

    4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...

随机推荐

  1. Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    前言   驱动的开发需要先熟悉基本概念类型,本篇讲解linux杂项设备基础,还是基于虚拟机ubuntu去制作驱动,只需要虚拟机就可以尝试编写注册杂项设备的基本流程.   linux三大设备驱动 字符设 ...

  2. RabbitMQ和RPC

    消息队列 消息队列中间件 (Message Queue Middleware,简称 MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,它可以在分布式环境下扩展进程间的数据通信,并基于数据 ...

  3. 【系统选型】企业即时通讯(IM)软件调研及供应商对比评估

    企业即时通讯(IM)软件调研及供应商对比评估 1.概览 1.1 即时通讯 即时通讯(Instant messaging,简称IM)是一个终端服务,允许两人或多人使用网路即时的传递文字讯息.档案.语音与 ...

  4. Html飞机大战(十六): 完成"清除"敌机奖励类

    好家伙,   我们先来尝试完成一个最简单的功能 正面buff: 1.消灭全图敌机   我们要先找一个好看一点的素材     把背景弄成透明的(搞了好久),感谢度娘的技术支持Photoshop中如何把图 ...

  5. 【Azure API 管理】APIM中的Policy是否有调用速率的方法(熔断机制)

    问题描述 APIM中的Policy是否有调用速率的方法(熔断机制) 问题解答 APIM的限制速率的方式有以下方式: 检查 HTTP 标头 - 强制 HTTP 标头必须存在和/或强制采用 HTTP 标头 ...

  6. RocketMQ(4) 消息的消费

    消费者从Broker中获取消息的方式有两种:pull拉取方式和push推动方式.消费者组对于消息消费的模 式又分为两种:集群消费Clustering和广播消费Broadcasting. 1. 获取消息 ...

  7. SpringCloud Hystrix断路器的基本使用

    官网资料: https://github.com/Netflix/Hystrix/wiki/How-To-Use 1. 服务雪崩 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系, ...

  8. 浅谈Zabbix与Prometheus区别

    Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...

  9. Prometheus技术分享——prometheus的函数与计算公式详解

    Prometheus与zabbix相比,它的强大之处就在于可以它可以使用的很多计算公式去获取自己需要的数据.当然,这里所涉及到的计算公式,也是我们普遍认为的难点所在.比如,我们要获取CPU使用率,使用 ...

  10. vue 动态加载css,改变网站皮肤模式

    Vue.mixin({ created () { require('view-design/dist/styles/iview.css') } }) 参考资料:https://blog.csdn.ne ...