【 [SCOI2016]幸运数字】
想法
倍增加上线性基就行惹
线性基的合并可以通过把一个线性基的元素插入到另一个里实现
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 20005
#define M 40005
ll cnt,v[N],G[N][21][62],head[N],dep[N];
ll fa[N][21],ans[62];
struct P{
int to,next;
}e[M];
void add(int x,int y){
e[++cnt].to = y;
e[cnt].next = head[x];
head[x] = cnt;
}
void insert(ll *a,ll val){
for(int i = 61;i >= 0;--i){
if((val >> i) & 1){
if(!a[i]){
a[i] = val;
break;
}
val ^= a[i];
}
}
}
void Merge(ll *a,ll *b){
for(int i = 61;i >= 0;--i){
if(b[i])
insert(a,b[i]);
}
}
void dfs(ll u,ll f){
fa[u][0] = f;
dep[u] = dep[f] + 1;
for(int i = head[u];i;i = e[i].next){
ll v = e[i].to;
if(v == f)
continue;
dfs(v,u);
}
}
ll n,q;
void getlca(){
for(int j = 1;j <= 20;++j)
for(int i = 1;i <= n;++i){
fa[i][j] = fa[fa[i][j - 1]][j - 1];
std::memcpy(G[i][j],G[i][j - 1],sizeof(G[i][j - 1]));
Merge(G[i][j],G[fa[i][j - 1]][j - 1]);
}
}
void lca(ll x,ll y){
if(dep[x] < dep[y])
std::swap(x,y);
for(int i = 20;i >= 0;--i){
if(dep[fa[x][i]] >= dep[y]){
Merge(ans,G[x][i]);
x = fa[x][i];
}
}
if(x == y){
Merge(ans,G[x][0]);
return;
}
for(int i = 20;i >= 0;--i){
if(fa[x][i] != fa[y][i]){
Merge(ans,G[x][i]);
Merge(ans,G[y][i]);
x = fa[x][i];
y = fa[y][i];
}
}
Merge(ans,G[x][0]),Merge(ans,G[y][0]),Merge(ans,G[fa[x][0]][0]);
return;
}
inline ll read(){
ll ans = 0,f = 1;
char a = getchar();
while(a < '0' && a > '9' && (a != '-'))
a = getchar();
if(a == '-')
f = -1,a = getchar();
while(a <= '9' && a >= '0'){
ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
}
return ans * f;
}
int main(){
n = read(),q = read();
for(int i = 1;i <= n;++i)
insert(G[i][0],read());
for(int i = 1;i <= n - 1;++i){
ll x = read(),y = read();
add(x,y);
add(y,x);
}
dfs(1,0);
getlca();
for(int i = 1;i <= q;++i){
ll u = read(),v = read();
std::memset(ans,0,sizeof(ans));
lca(u,v);
ll sum = 0;
for(int i = 61;i >= 0;--i){
if(ans[i])
sum = std::max(sum,sum ^ (ans[i]));
}
std::cout<<sum<<std::endl;
}
}
【 [SCOI2016]幸运数字】的更多相关文章
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- [SCOI2016]幸运数字 树链剖分,线性基
[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
随机推荐
- java的加载与执行原理详解
java程序从开发到最终运行经历了什么? (31) 编译期: 第一步:在硬盘某个位置(随意),新建一个xxx.java文件 第二步:使用记事本或者其他文本编辑器例如EditPlus打开xxx.java ...
- JDK里常见容器总结
自己总结. 扩容 线程安全 是否支持null 的key 说明 hashmap 2*length 否 是 1.8以后增加红黑树.提高检索效率 hashtable 是 否 官方不建议使 ...
- 2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...
- 2021.9.25考试总结[NOIP模拟61]
终于有点阳间题了然而挂了60pts 哈哈 T1 交通 类似简单题,限制看似很复杂,但不难发现当确定一条边是否被删后会产生裙带关系,很多边会跟着自动被确定是否被删. 仔细观察可以得出这种关系会构成偶环结 ...
- 攻防世界 杂项13.can_has_stdio?
打开发现是由trainfuck编码组成的小星星阵容,果断交给解密网站进行解密, 解密网站:http://ctf.ssleye.com/brain.html flag:flag{esolangs_for ...
- STM32程序异常——中断处理要谨慎
问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- cf2A Winner(implementation)
题意: N个回合. 每个回合:name score[名为name的这个人得了score分(可负可正)]. 问最后谁的累积分数是最高的.设为M.如果有好几个都得了M,找出这几个人中哪个最早回合累积分数超 ...
- DeWeb部署
DeWeb部署 部署时需要runtime中的大部分文件 需要的目录有: apps,仅包括需要部署的dll即可 dist,必须.请勿改动 media,非必须,一般媒体文件存在于此目录 upload,必须 ...
- 关于ENSP错误代码的常见问题
1.最适合ensp运行的环境是win7,在win7上运行基本不会出什么大问题(ensp370+virtualbox4.2.8) 2.如果需要重新安装,最好把旧版本清除干净,ensp+virtualbo ...