【BZOJ4568】幸运数字(线性基,树链剖分,ST表)

题面

BZOJ

Description

A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个

幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划

乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。

在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸

运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。例如,

游览者拍了 3 张照片,幸运值分别是 5,7,11,那么最终保留在自己身上的幸运值就是 9(5 xor 7 xor 11)。

有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 5

和 11 ,可以保留的幸运值为 14 。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中

可以保留的最大幸运值是多少。

Input

第一行包含 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

Output

输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。

Sample Input

4 2

11 5 7 9

1 2

1 3

1 4

2 3

1 4

Sample Output

14

11

题解

很显然,树链剖分之后维护路径上的线性基

然而线段树是\(log^4\)

所以用\(ST\)表来处理(反正没有修改)

时间复杂度\(O(nlog^3)\)

单次询问复杂度也是\(log^3\)

(线性基的合并的复杂度是\(log^2\)的!!!)

总的复杂度\(O((n+Q)log^3)\)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MAX 22222
  15. inline ll read()
  16. {
  17. RG ll x=0,t=1;RG char ch=getchar();
  18. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  19. if(ch=='-')t=-1,ch=getchar();
  20. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  21. return x*t;
  22. }
  23. struct Line{int v,next;}e[MAX<<1];
  24. int h[MAX],cnt=1,lg[MAX];
  25. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  26. int n,Q;
  27. ll V[MAX];
  28. struct xxj
  29. {
  30. ll p[61];int ele;
  31. void clear(){memset(p,0,sizeof(p));ele=0;}
  32. void insert(ll x)
  33. {
  34. if(ele==61)return;
  35. for(int i=60;i>=0;--i)
  36. {
  37. if(~x&(1ll<<i))continue;
  38. if(!p[i]){p[i]=x;++ele;break;}
  39. x^=p[i];
  40. }
  41. }
  42. ll Query(ll x)
  43. {
  44. for(int i=60;i>=0;--i)x=max(x,x^p[i]);
  45. return x;
  46. }
  47. }t[17][MAX];
  48. xxj Merge(xxj a,xxj b)
  49. {
  50. for(int i=0;i<=60&&a.ele!=61;++i)if(b.p[i])a.insert(b.p[i]);
  51. return a;
  52. }
  53. int size[MAX],hson[MAX],top[MAX],fa[MAX],dep[MAX],dfn[MAX],tim;
  54. void dfs1(int u,int ff)
  55. {
  56. fa[u]=ff;size[u]=1;dep[u]=dep[ff]+1;
  57. for(int i=h[u];i;i=e[i].next)
  58. {
  59. int v=e[i].v;
  60. if(v==ff)continue;
  61. dfs1(v,u);
  62. size[u]+=size[v];
  63. if(size[v]>size[hson[u]])hson[u]=v;
  64. }
  65. }
  66. void dfs2(int u,int tp)
  67. {
  68. top[u]=tp;dfn[u]=++tim;
  69. t[0][tim].insert(V[u]);
  70. if(hson[u])dfs2(hson[u],tp);
  71. for(int i=h[u];i;i=e[i].next)
  72. {
  73. int v=e[i].v;
  74. if(v==fa[u]||v==hson[u])continue;
  75. dfs2(v,v);
  76. }
  77. }
  78. xxj ans;
  79. xxj Get(int l,int r)
  80. {
  81. int ln=lg[r-l+1];
  82. return Merge(t[ln][l],t[ln][r-(1<<ln)+1]);
  83. }
  84. int main()
  85. {
  86. n=read();Q=read();
  87. for(int i=1;i<=n;++i)V[i]=read();
  88. for(int i=1;i<n;++i)
  89. {
  90. int u=read(),v=read();
  91. Add(u,v);Add(v,u);
  92. }
  93. dfs1(1,0);dfs2(1,1);
  94. for(int i=2;i<=n;++i)lg[i]=lg[i>>1]+1;
  95. for(int j=1;j<=lg[n];++j)
  96. for(int i=1;i+(1<<j)-1<=n;++i)
  97. t[j][i]=Merge(t[j-1][i],t[j-1][i+(1<<(j-1))]);
  98. while(Q--)
  99. {
  100. int x=read(),y=read();ans.clear();
  101. while(top[x]!=top[y])
  102. {
  103. if(dep[top[x]]<dep[top[y]])swap(x,y);
  104. ans=Merge(Get(dfn[top[x]],dfn[x]),ans);
  105. x=fa[top[x]];
  106. }
  107. if(dep[x]<dep[y])swap(x,y);
  108. ans=Merge(Get(dfn[y],dfn[x]),ans);
  109. printf("%lld\n",ans.Query(0));
  110. }
  111. return 0;
  112. }

【BZOJ4568】幸运数字(线性基,树链剖分,ST表)的更多相关文章

  1. bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分

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

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

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

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

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

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

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

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

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

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

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

  7. P3292 [SCOI2016]幸运数字 线性基

    正解:线性基+倍增 解题报告: 先放下传送门QAQ 然后这题,其实没什么太大的技术含量,,,?就几个知识点套在一起,除了代码长以外没任何意义,主要因为想复习下线性基的题目所以还是写下,,, 随便写下思 ...

  8. BZOJ.4516.[SCOI2016]幸运数字(线性基 点分治)

    题目链接 线性基可以\(O(log^2)\)暴力合并.又是树上路径问题,考虑点分治. 对于每个点i求解 LCA(u,v)==i 时的询问(u,v),只需求出这个点到其它点的线性基后,暴力合并. LCA ...

  9. [SCOI2016]幸运数字 线性基

    题面 题面 题解 题面意思非常明确:求树上一条链的最大异或和. 我们用倍增的思想. 将这条链分成2部分:x ---> lca , lca ---> y 分别求出这2个部分的线性基,然后合并 ...

  10. BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增

    [题目分析] 考虑异或的最大值,维护线性基就可以了. 但是有多次的询问,树剖或者倍增都可以. 想了想树剖动辄数百行的代码. 算了,我还是写倍增吧. 注:被位运算和大于号的优先级坑了一次,QaQ [代码 ...

随机推荐

  1. 深入解析QML引擎, 第4部分: 自定义解析器

    原文 QML Engine Internals, Part 4: Custom Parsers ——————————————————————————————————————————— 上一篇 绑定类型 ...

  2. jquery Ajax请求中显示Loading...

    jquery Ajax请求中显示Loading... $('#btnTest').click(function(){      $.ajax({           url ---- ,根据你需要设置 ...

  3. 【SpringCloud】第十一篇: 断路器监控(Hystrix Dashboard)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  4. 原生WebGL场景中绘制多个圆锥圆柱

    前几天解决了原生WebGL开发中的一个问题,就是在一个场景中绘制多个几何网格特征不同的模型,比如本文所做的绘制多个圆锥和圆柱在同一个场景中,今天抽空把解决的办法记录下来,同时也附上代码.首先声明,圆柱 ...

  5. Python如何判断变量的类型

    Python判断变量的类型有两种方法:type() 和 isinstance() 如何使用 对于基本的数据类型两个的效果都一样 type() ip_port = ['219.135.164.245', ...

  6. 3星|《给你讲个笑话:我是创业公司CEO》:创业成功就是上帝掷骰子

    给你讲个笑话:我是创业公司CEO 作者有过数次创业经历,最后一次在济南创业,后来公司搬到北京,看书中的交代公司目前好像还不算太成功.书中交代作者公司的业务是文化产品的策划,没细说做什么,也没说做成过哪 ...

  7. Wampserver 修改根目录

    wampserver 默认根目录在 www 文件夹下 修改根目录方法如下: 1. 在打算存放项目或代码的位置新建文件夹(我建在了C:/MyProject) 2. 打开 httpd.conf 文件(该文 ...

  8. Scrum立会报告+燃尽图(Beta阶段第二次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://coding.net/u/wuyy694 ...

  9. HDU 1121 Complete the Sequence 差分

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1121 Complete the Sequence Time Limit: 3000/1000 MS ...

  10. 关于虚拟机安装mac os 教程详解

    环境搭建 VMware下载 百度云盘下载:链接:http://pan.baidu.com/s/1pK8RcLl 密码:5jc5 Unlocker208 百度云盘下载:链接:http://pan.bai ...