BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
解题思路
异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度$O(nlog^3n)$,并不知道咋过去的。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=20005;
template<class T> void rd(T &x){
x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
}
int n,q,head[N],cnt,to[N<<1],nxt[N<<1],f[N][20],dep[N];
LL w[N];
struct Base{
LL a[62];
inline void insert(LL x){
if(!x) return ;
for(int i=60;~i;i--)
if((1ll<<i)&x){
if(!a[i]) {a[i]=x; break;}
x^=a[i]; if(!x) break;
}
}
inline void clear() {memset(a,0,sizeof(a));}
inline LL query(){
LL ret=0;
for(int i=60;~i;i--)
if(a[i] && (ret^a[i])>ret) ret^=a[i];
return ret;
}
}b[N][17],ans;
inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
}
inline void build(Base &zz,Base B){
for(int i=60;~i;i--)
if(B.a[i]) zz.insert(B.a[i]);
}
void dfs(int x,int F){
f[x][0]=F; b[x][0].insert(w[x]);
for(int i=1;i<=15;i++) {
f[x][i]=f[f[x][i-1]][i-1];
if(f[x][i]) b[x][i]=b[x][i-1],build(b[x][i],b[f[x][i-1]][i-1]);
}
for(int i=head[x];i;i=nxt[i]){
int u=to[i]; if(u==F) continue;
dep[u]=dep[x]+1; dfs(u,x);
}
}
inline int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=15;~i;i--)
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
for(int i=15;~i;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void solve(int x,int y){
int lca=LCA(x,y); ans.clear();
for(int i=15;~i;i--)
if(dep[f[x][i]]>=dep[lca]) {
build(ans,b[x][i]);
x=f[x][i];
}
for(int i=15;~i;i--)
if(dep[f[y][i]]>=dep[lca]){
build(ans,b[y][i]);
y=f[y][i];
}
ans.insert(w[lca]);
printf("%lld\n",ans.query());
}
int main(){
rd(n); rd(q); int x,y;
for(int i=1;i<=n;i++) rd(w[i]);
for(int i=1;i<n;i++){
rd(x); rd(y);
add(x,y); add(y,x);
}
dep[1]=1; dfs(1,0);
while(q--){
rd(x),rd(y);
solve(x,y);
}
return 0;
}
BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)的更多相关文章
- 【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]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增
[题目分析] 考虑异或的最大值,维护线性基就可以了. 但是有多次的询问,树剖或者倍增都可以. 想了想树剖动辄数百行的代码. 算了,我还是写倍增吧. 注:被位运算和大于号的优先级坑了一次,QaQ [代码 ...
- BZOJ 4568 [Scoi2016]幸运数字(树链剖分 + 异或线性基)
题目链接 BZOJ 4568 考虑树链剖分+线段树维护每一段区域的异或线性基 对于每个询问,求出该点集的异或线性基.然后求一下这个线性基里面能异或出的最大值即可. #include <bits ...
随机推荐
- phpstudy的80端口被占用问题
1.查看电脑中当前程序占用的端口和程序ID 当phpstudy设置端口号为80时显示占用,在命令行中输入:netstat -ano 就可以看到当前电脑中程序占用的端口和程序ID等等信息 2.查看正在运 ...
- CTF | bugku | 速度要快
检查源码时发现有 <!-- OK ,now you have to post the margin what you find --> 检查响应头发现有 flag: 6LeR55qE6L+ ...
- UITableView 支持左右滑动(二)
原理: 用tableView其中一个cell 来展示一个 UIScrollView, 在scrollview上很像放置子tableView 注意点: 外层tableView需要实现手势代理 /* 若重 ...
- Process Monitor监控进程操作注册表如何实现?
http://zhidao.baidu.com/link?url=Kqav4qkQSprC5FnpHPOGJvhqvY9fJ9-Vdx9g_SWh4w5VOusdRJo4Vl7qIdrG4LwRJvr ...
- 安装php时,configure: error: xml2-config not found. Please check your libxml2 installation
参考文章:http://blog.csdn.net/anljf/article/details/6981247 安装php时的报错configure: error: xml2-config not f ...
- Java前端控制器模式~
前端控制器设计模式用于提供集中式请求处理机制,以便所有请求将由单个处理程序处理.此处理程序可以执行请求的身份验证/授权/记录或跟踪,然后将请求传递到相应的处理程序. 以下是这种类型的设计模式的实体. ...
- “希希敬敬对”队软件工程第九次作业-beta冲刺第三次随笔
“希希敬敬对”队软件工程第九次作业-beta冲刺第三次随笔 队名: “希希敬敬对” 龙江腾(队长) 201810775001 杨希 201810812008 何敬 ...
- leetcode.分治.241为运算表达式设计优先级-Java
1. 具体题目 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: & ...
- RabbitMq--2--安装
简单说下个人的理解,mq就是一个消息代理,负责异步消息转发,可以很大程度缓解服务器压力,并且防止服务器宕机影响业务等. 安装: 环境:centos7 1).首先需要安装erlang #wget htt ...
- IT面试技巧(1)
声明:以下面试技巧仅作参考,更多的时候还是要真实得表达自我,要保持一定的职业素养. 1.请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有 ...