【bzoj4568 scoi2016】幸运数字
题目描述
A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。
一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。
例如,游览者拍了 3 张照片,幸运值分别是 5,7,11,那么最终保留在自己身上的幸运值就是 9(5 xor 7 xor 11)。
有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 5 和 11 ,可以保留的幸运值为 14 。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中可以保留的最大幸运值是多少。
输入输出格式
输入格式:
第一行包含 2 个正整数 n ,q,分别表示城市的数量和旅行者数量。第二行包含 n 个非负整数,其中第 i 个整数 Gi 表示 i 号城市的幸运值。随后 n-1 行,每行包含两个正整数 x ,y,表示 x 号城市和 y 号城市之间有一条道路相连。随后 q 行,每行包含两个正整数 x ,y,表示这名旅行者的旅行计划是从 x 号城市到 y 号城市。N<=20000,Q<=200000,Gi<=2^60
输出格式:
输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。
题意:
一棵树,节点有权值,求出一个节点到另一个节点的路径上的异或最大值。
题解:
①要求出多个数异或max还是用线性基好一点,用倍增加速线性基;
②先倍增预处理lca,同时预处理出lca移动路径上的节点线性基;
③查询先求出lca,然后像这样,类似于rmq的思想,暴力合并四个线性基:
aaarticlea/png;base64,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" alt="" />用一些位运算技巧可以算出每个数的最高二进制有效位数和线性基的sz(是否满)可以优化掉很多常数,但这样好像已经可以过了。
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int N = ;
int n,m,f[N][],hd[N],o,lg[N],p[],lwt[N],dep[N];
ll w[N];
struct Edge{int v,nt;}E[*N];
int cal(ll x){
int ret=;
for(int i=;i;i>>=)if(x>>i)x>>=i,ret|=i;
return ret;
}
struct basis{
ll d[];
void ins(ll x){
for(int i = cal(x);i >= ;i--)
if((x>>i)&){
if(!d[i]) {d[i] = x;break;}
else x^=d[i];
}
}
ll mx(){
ll ret = ;
for(int i = ;i >= ;i--) if(d[i]) ret = max(ret,ret^d[i]);
return ret;
}
void merge(basis a){
for(int i = ;i >= ;i--) if(a.d[i]) ins(a.d[i]);
}
}Bs[N][],tmp;
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
ll rd(){
ll x = ; char c = gc();
while(c<''||c>'') c = gc();
while(c>=''&&c<='') x=x*+c-'',c = gc();
return x;
}
void adde(int u,int v){
E[o] = (Edge){v,hd[u]}; hd[u] = o++;
E[o] = (Edge){u,hd[v]}; hd[v] = o++;
}
void dfs(int u,int fa){
dep[u]=dep[fa]+; f[u][] = fa; Bs[u][].ins(w[fa]);
for(int i = ;i <= && p[i]<dep[u];i++){
f[u][i] = f[f[u][i-]][i-];
Bs[u][i] = Bs[u][i-];
Bs[u][i].merge(Bs[f[u][i-]][i-]);
}
for(int i = hd[u],v;i!=-;i=E[i].nt)if((v=E[i].v)!=fa) dfs(v,u);
}
int get(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i = dep[u]-dep[v];i;i-=lwt[i]) u = f[u][lg[lwt[i]]];
if(u==v) return u;
for(int i = ;i >= ;i--)if(f[u][i]!=f[v][i]){u = f[u][i]; v = f[v][i];}
return f[u][];
}
void query(int u,int v){
int lca = get(u,v);
memset(tmp.d,,sizeof(tmp.d));
tmp.ins(w[u]),tmp.ins(w[v]);
if(u!=lca){
int lu = dep[u] - dep[lca];
tmp.merge(Bs[u][lg[lu]]);
for(int i = lu-p[lg[lu]];i;i-=lwt[i]) u = f[u][lg[lwt[i]]];
tmp.merge(Bs[u][lg[lu]]);
}
if(v!=lca){
int lv = dep[v] - dep[lca];
tmp.merge(Bs[v][lg[lv]]);
for(int i = lv-p[lg[lv]];i;i-=lwt[i]) v = f[v][lg[lwt[i]]];
tmp.merge(Bs[v][lg[lv]]);
}
ll ans = tmp.mx();
printf("%lld\n",ans);
}
int main()
{ freopen("bzoj4568.in","r",stdin);
freopen("bzoj4568.out","w",stdout);
n = rd(); m = rd();
lg[] = -;
for(int i = ;i <= n;i++) w[i]=rd(),hd[i] = -,lg[i]=lg[i>>]+,lwt[i]=i&(-i);
for(int i = p[] = ;i <= ;i++) p[i] = p[i-]*;
for(int i = ;i < n;i++) adde(rd(),rd());
dfs(,);
for(int i = ;i <= m;i++) {
int u = rd(),v = rd();
query(u,v);
//printf("%d\n",i);
}
//printf("haha\n");
return ;
}//by tkys_Austin;
【bzoj4568 scoi2016】幸运数字的更多相关文章
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字
板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...
- bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分
A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A ...
- BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】
题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...
- BZOJ4568 : [Scoi2016]幸运数字
树的点分治,每次求出重心后,求出重心到每个点路径上的数的线性基. 对于每个询问,只需要暴力合并两个线性基即可. 时间复杂度$O(60n\log n+60^2q)$. #include<cstdi ...
- 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...
- BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
随机推荐
- C语言--第二周作业
****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...
- WebAPI 跨域解决方案.
先下载支持跨域的.dll,然后using System.Web.Http.Cors. 我把webapi解决方案部署到IIS上了.测试过后可以解决跨域. 方案一(用了*号,这样有安全隐患.): 直接在w ...
- python hashlib、hmac模块
一.hashlib模块 import hashlib m = hashlib.md5() m.update(b"Hello") print(m.hexdigest()) m.upd ...
- Mego开发文档 - 数据属性生成值
数据属性生成值 该功能用于在数据插入或更新时为指定属性生成期望的值,Mego提供了非常灵活的实现方式以满足各种数据提交时的自动赋值问题. 生成值目的及模式 在Mego中生成值的目的一定是插入数据或更新 ...
- 新概念英语(1-47)A cup of coffee
新概念英语(1-47)A cup of coffee How does Ann like her coffee? A:Do you like coffee, Ann? B:Yes, I do. A:D ...
- MYSQL 面试查询系列问题
表结构: `student`('id'.'name'.'code'.'age'.'sex')学生表 `teacher`('id'.'name')教师表 `course`('id'.'name'.'te ...
- cache和buffer
一.free命令是Linux查看内存使用情况的命令 1. centos 7风格 [root@bogon init.d]# free -m total used free shared buff/cac ...
- CWMP开源代码研究——stun的NAT穿透
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 参考: http://www.cnblogs.com/myblesh/p/6259765.htm ...
- 南京邮电大学java程序设计作业在线编程第一次作业
王利国的"Java语言程序设计第1次作业(2018)"详细 作业结果详细 总分:100 选择题得分:40 1. Java语言中,基本数据类型一共有( )种. A.16 B.2 C ...
- ArUco----一个微型现实增强库的介绍及视觉应用(一)
ArUco----一个微型现实增强库的介绍及视觉应用(一) 一.ArUco简介 ArUco是一个开源的微型的现实增强库,目前好像已经集成在OpenCV3.0以上的版本内了,它除了用于现实增强,还很用于 ...