【bzoj数据下载地址】不要谢我


先讲一下窝是怎么错的。。。
\(MLE\)是因为数组开小了。。


看到异或和最大,那么就会想到用线性基。
如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记and乱口胡总结


但是这一道题目需要合并线性基。
如何合并线性基?
不需要什么花里胡哨的操作,直接暴力插入就可以了。

  1. void merge(xxj &x, xxj y) {
  2. for (int i = BIT; ~i; i --)
  3. if (y.p[i]) x.ins(y.p[i]);
  4. }

代码中的\(x\)和\(y\)是两个线性基。
原理就是把\(y\)中的每一个元素插入到\(x\)中。
然后再套一个倍增求\(LCA\)就可以了。

代码

  1. #include <bits/stdc++.h>
  2. #define gc getchar
  3. using namespace std;
  4. typedef long long ll;
  5. const int BIT = 62;
  6. const int LOG = 21;
  7. const int N = 40005;
  8. template <typename T> void read(T &x) {
  9. x = 0; T fl = 1; char c = 0;
  10. for (; c < '0' || c > '9'; c = gc())
  11. if (c == '-') fl = -1;
  12. for (; c >= '0' && c <= '9'; c = gc())
  13. x = (x << 1) + (x << 3) + (c ^ 48);
  14. x *= fl;
  15. }
  16. struct xxj {
  17. ll p[BIT + 2];
  18. void clear() { memset(p, 0, sizeof(p)); }
  19. void ins(ll x) {
  20. for (int i = BIT; ~i; i --) {
  21. if ((x >> i) == 0) continue;
  22. if (!p[i]) { p[i] = x; break; }
  23. x ^= p[i];
  24. }
  25. }
  26. } g[N][LOG + 2], ans;
  27. struct edge {
  28. int to, nt;
  29. } E[N];
  30. int fa[N][LOG + 2];
  31. int n, ecnt, Q;
  32. int dep[N], H[N];
  33. void add_edge(int u, int v) {
  34. E[++ ecnt] = (edge){v, H[u]};
  35. H[u] = ecnt;
  36. }
  37. void merge(xxj &x, xxj y) {
  38. for (int i = BIT; ~i; i --)
  39. if (y.p[i]) x.ins(y.p[i]);
  40. }
  41. void dfs(int u, int ft) {
  42. fa[u][0] = ft; dep[u] = dep[ft] + 1;
  43. for (int i = 1; i <= LOG; i ++) {
  44. fa[u][i] = fa[fa[u][i - 1]][i - 1];
  45. g[u][i] = g[u][i - 1];
  46. merge(g[u][i], g[fa[u][i - 1]][i - 1]);
  47. }
  48. for (int e = H[u]; e; e = E[e].nt) {
  49. int v = E[e].to;
  50. if (v == fa[u][0]) continue;
  51. dfs(v, u);
  52. }
  53. }
  54. void Lca(int u, int v) {
  55. if (dep[u] < dep[v]) swap(u, v);
  56. for (int i = LOG; ~i; i --)
  57. if (dep[fa[u][i]] >= dep[v])
  58. merge(ans, g[u][i]), u = fa[u][i];
  59. if (u == v) {
  60. merge(ans, g[u][0]);
  61. return;
  62. }
  63. for (int i = LOG; ~i; i --) {
  64. if (fa[u][i] != fa[v][i]) {
  65. merge(ans, g[u][i]);
  66. merge(ans, g[v][i]);
  67. u = fa[u][i]; v = fa[v][i];
  68. }
  69. }
  70. merge(ans, g[u][0]);
  71. merge(ans, g[v][0]);
  72. merge(ans, g[fa[u][0]][0]);
  73. }
  74. int main() {
  75. read(n); read(Q);
  76. for (int i = 1; i <= n; i ++) {
  77. ll x; read(x);
  78. g[i][0].ins(x);
  79. }
  80. for (int i = 1, u, v; i < n; i ++) {
  81. read(u); read(v);
  82. add_edge(u, v);
  83. add_edge(v, u);
  84. }
  85. dfs(1, 0);
  86. while (Q --) {
  87. int u, v; read(u); read(v);
  88. ans.clear();
  89. Lca(u, v);
  90. ll res = 0ll;
  91. for (int i = BIT; ~i; i --)
  92. if ((res ^ ans.p[i]) > res) res ^= ans.p[i];
  93. cout << res << endl;
  94. }
  95. return 0;
  96. }

「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】的更多相关文章

  1. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  2. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  3. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2131  Solved: 865[Submit][Statu ...

  4. 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)

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

  5. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  6. 「 洛谷 」P2768 珍珠项链

    珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...

  7. 「 洛谷 」P4539 [SCOI2006]zh_tree

    小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...

  8. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  9. 【bzoj4568 scoi2016】幸运数字

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

随机推荐

  1. 或许,挂掉的点总是出人意料(hw其实蛮有好感的公司)

    1:问了有没有考研的打算,为什么: ` 实验室指导自己的两个学长, 他们两个都是不考研党派,当然两个学长本科都进入了不错的公司hw,xm,耳濡目染就自己也就不想去考研了: 跟一些已经工作的程序员聊天, ...

  2. Git:修改Git Bash默认打开位置(win10)

    1.起因 大家写的代码不可能直接保存在根目录下,但是Git Bash每次一打开就是根目录,每次都要切换路径很麻烦. 2.修改Git Bash默认打开位置 1)Git Bash右键 -> 属性 2 ...

  3. Linux中 SonarQube代码质量管理平台以及C++插件安装

    SonarQube是管理代码质量一个开源平台,可以快速的定位代码中潜在的或者明显的错误. SonarQube安装 1.环境准备 (1)sonarQube 下载地址https://www.sonarqu ...

  4. MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点

    1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...

  5. c#二进制移位运算符 "<<"及">>","&","|","^"

    移位运算符 & :按位与,其实与&&逻辑运算符有一致的地方: | :按位或,同样与||有类似的地方. ~:按位取反 ^:按位异或 <<:左移运算符 >> ...

  6. IIS 反向代理到 Apache、Tomcat

    将请求的网址重写重定向到其它网址.当80端口被占用无法同时使用两个Web服务的解决方案,使得IIS和Apache Tomcat 共存 环境 WindowServer 2008 IIS7 Apache ...

  7. Linux Collection:系统信息和配置

    PAS Linux系统配置相关文件 /etc 目录中是系统和各类软件的配置文件 /var/log 系统日志 /proc 系统运行信息 PAS /boot空间不足 查看内核 dpkg --get-sel ...

  8. tian

    上次后来没继续在微信上聊,是因为快过年了,想趁那段时间结合年假做点东西.接下来阳历三四月份就受美国制裁.结果接下来制裁.fang. 16年的那次主要是生气,在一块儿 另外经济上也有问题. 我也想过不再 ...

  9. 使用opencv进行简单的手势检测[by Python]

    代码参考于:https://github.com/rainyear/lolita/issues/8 简单的手势识别,基本思路是基于皮肤检测,皮肤的颜色在HSV颜色空间下与周围环境的区分度更高,从RGB ...

  10. fastjson List转JSONArray以及JSONArray转List

    1.fastjson  List转JSONArrayList<T> list = new ArrayList<T>();JSONArray array= JSONArray.p ...