解析

虽然使用三个log的倍增算法艹过去了
但是我们还是来聊聊正解吧

考虑点分治
对于当前的根,dfs求出联通块内每个点到当前根的线性基
一条路径的答案应该在路径出现上第一个成为根的点时统计到
具体来说,就是路径的两端点在同一个solve函数的不同子树内
通过奇怪的时间戳标记可以实现
对于询问,每个结点开个vector暴力遍历即可
由于每个结点最多被dfslog遍,所以复杂度是对的
复杂度瓶颈在dfs求线性基上,时间复杂度nlog2nnlog^2nnlog2n
然后就ok啦
但是懒得再写一遍了,所以还是贴的3log代码

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf (n+1)
//#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e4+100;
const int M=2e5+10500;
const double eps=1e-5;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}ll mi[65];struct basic{ll v[62];basic(){memset(v,0,sizeof(v));}void upd(ll x){for(int i=60;i>=0;i--){if(x&mi[i]){if(!v[i]){v[i]=x;break;}else x^=v[i];}}}
}b[N][16];
inline void merge(basic &v1,basic v2){for(int i=0;i<=60;i++){if(v2.v[i]) v1.upd(v2.v[i]);}return;
}ll val[N];
int pl[N][16],dep[N];
void dfs(int x,int f){b[x][0].upd(val[f]);pl[x][0]=f;for(int k=1;pl[x][k-1];k++){pl[x][k]=pl[pl[x][k-1]][k-1];b[x][k]=b[x][k-1];merge(b[x][k],b[pl[x][k-1]][k-1]);}dep[x]=dep[f]+1;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs(to,x);}return;
}
basic res;
ll query(int x,int y){memset(res.v,0,sizeof(res.v));res.upd(val[x]);res.upd(val[y]);if(dep[x]<dep[y]) swap(x,y);for(int k=15;k>=0;k--){if(dep[x]-mi[k]<dep[y]) continue;merge(res,b[x][k]);x=pl[x][k];}if(x!=y){for(int k=15;k>=0;k--){if(pl[x][k]==pl[y][k]) continue;merge(res,b[x][k]);merge(res,b[y][k]);x=pl[x][k];y=pl[y][k];}res.upd(val[pl[x][0]]);}ll ans(0);for(int i=60;i>=0;i--){//if(res.v[i]) printf("i=%d v=%lld\n",i,res.v[i]);if(!res.v[i]||(ans&mi[i])) continue;ans^=res.v[i];//printf("  ans=%lld\n",ans);}//putchar('\n');return ans;
}
int main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifmemset(fi,-1,sizeof(fi));cnt=-1;mi[0]=1;for(int i=1;i<=60;i++) mi[i]=(mi[i-1]<<1);n=read();m=read();for(int i=1;i<=n;i++) val[i]=read();for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}dfs(1,0);for(int i=1;i<=m;i++){int x=read(),y=read();printf("%lld\n",query(x,y));}return 0;
}
/*
*/

YBTOJ洛谷P3292:幸运数字(线性基、点分治/倍增)相关推荐

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

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

  2. YBTOJ洛谷P4068:数字配对(网络流)

    文章目录 题目描述 解析 代码 题目描述 有n种数字,第 i 种数字是 ai,有 bi个,权值是 ci. 若两个数字 ai,aj 满足, ai 是 aj 的倍数,且 ai/aj 是一个质数,那么这两个 ...

  3. YBTOJ洛谷P4331:数字序列(左偏树)

    文章目录 题目描述 数据范围 解析 代码 题目描述 数据范围 n<=1e6n<=1e6n<=1e6 解析 先考虑简单情况 如果原数列是单调递增的,显然应该使bi=aib_i=a_ib ...

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

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

  5. 洛谷试炼场 P1553 数字反转(升级版)题解

    洛谷试炼场 P1553 数字反转(升级版)题解 [c] 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数. ...

  6. 洛谷P4390 [BOI2007]Mokia 摩基亚 题解

    洛谷P4390 [BOI2007]Mokia 摩基亚 题解 题目链接:P4390 [BOI2007]Mokia 摩基亚 题意:摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和 ...

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

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

  8. 幸运数字(洛谷-P3292)

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

  9. YBTOJ洛谷P4869:出现位置(线性基)

    解析 关键结论: 若 nnn 个数组成的线性基大小为 SSS,则其子集异或组成的结果有 2S2^S2S 种,且每种结果都有 2n−S2^{n-S}2n−S 种方案. 证明:考虑 n−Sn-Sn−S 个 ...

最新文章

  1. CVPR 2022|处理速度仅用0.2秒!港科大腾讯AI lab开源基于GAN反演的高保真图像编辑算法...
  2. Vue.js 第二天: 列表渲染
  3. Linux python impala/sasl/thrift-sasl command not found
  4. [慕课笔记] node+mongodb建站攻略
  5. 四种π型RC滤波电路
  6. jeecms v9开发资料
  7. 华为鸿蒙OS 2.0正式发布!明年华为手机将全面支持!
  8. 使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?
  9. 【Java】Socket实现的C/S模式半UI多人聊天程序
  10. 索尼入局电动汽车市场 宣布成立移动出行公司
  11. 【转载】世界上最牛的编辑器: Vim 3 (原创动图演示所有例子!)
  12. 国内稳定的暗黑2服务器,国内暗黑2战网的基本概念介绍
  13. android系统查看wifi密码,安卓手机如何查看WIFI密码
  14. go TCP 粘包原理和解决方案
  15. java short 转char_byte,short,char的类型转换
  16. 乱哄哄,你方唱罢我登场,到头来,都是为他人做嫁衣裳!
  17. win10查看端口号
  18. emqttd 2.2安装和测试使用
  19. 物研究所做一位科研人员
  20. 解密mysql导出的ncx文件内的加密密码

热门文章

  1. 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
  2. 推荐系统相关算法(2):k-nearest neighbor
  3. mysql 1117_1117Mysql prepare预处理语句
  4. android qq红包,Android实现QQ抢红包插件
  5. 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
  6. spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身
  7. 安卓平板运行python_使用Python进行手机平板移动开发 | 学步园
  8. python中list的意思_list在python中是什么意思
  9. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
  10. python魔术方法由谁定义_Python的魔术方法