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


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


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


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

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

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

代码

#include <bits/stdc++.h>
#define gc getchar
using namespace std;
typedef long long ll;
const int BIT = 62;
const int LOG = 21;
const int N = 40005;
template <typename T> void read(T &x) {
    x = 0; T fl = 1; char c = 0;
    for (; c < '0' || c > '9'; c = gc())
        if (c == '-') fl = -1;
    for (; c >= '0' && c <= '9'; c = gc())
        x = (x << 1) + (x << 3) + (c ^ 48);
    x *= fl;
}
struct xxj {
    ll p[BIT + 2];
    void clear() { memset(p, 0, sizeof(p)); }
    void ins(ll x) {
        for (int i = BIT; ~i; i --) {
            if ((x >> i) == 0) continue;
            if (!p[i]) { p[i] = x; break; }
            x ^= p[i];
        }
    }
} g[N][LOG + 2], ans;
struct edge {
    int to, nt;
} E[N];
int fa[N][LOG + 2];
int n, ecnt, Q;
int dep[N], H[N];
void add_edge(int u, int v) {
    E[++ ecnt] = (edge){v, H[u]};
    H[u] = ecnt;
}
void merge(xxj &x, xxj y) {
    for (int i = BIT; ~i; i --)
        if (y.p[i]) x.ins(y.p[i]);
}
void dfs(int u, int ft) {
    fa[u][0] = ft; dep[u] = dep[ft] + 1;
    for (int i = 1; i <= LOG; i ++) {
        fa[u][i] = fa[fa[u][i - 1]][i - 1];
        g[u][i] = g[u][i - 1];
        merge(g[u][i], g[fa[u][i - 1]][i - 1]);
    }
    for (int e = H[u]; e; e = E[e].nt) {
        int v = E[e].to;
        if (v == fa[u][0]) continue;
        dfs(v, u);
    }
}
void Lca(int u, int v) {
    if (dep[u] < dep[v]) swap(u, v);
    for (int i = LOG; ~i; i --)
        if (dep[fa[u][i]] >= dep[v])
            merge(ans, g[u][i]), u = fa[u][i];
    if (u == v) {
        merge(ans, g[u][0]);
        return;
    }
    for (int i = LOG; ~i; i --) {
        if (fa[u][i] != fa[v][i]) {
            merge(ans, g[u][i]);
            merge(ans, g[v][i]);
            u = fa[u][i]; v = fa[v][i];
        }
    }
    merge(ans, g[u][0]);
    merge(ans, g[v][0]);
    merge(ans, g[fa[u][0]][0]);
}
int main() {
    read(n); read(Q);
    for (int i = 1; i <= n; i ++) {
        ll x; read(x);
        g[i][0].ins(x);
    }
    for (int i = 1, u, v; i < n; i ++) {
        read(u); read(v);
        add_edge(u, v);
        add_edge(v, u);
    }
    dfs(1, 0);
    while (Q --) {
        int u, v; read(u); read(v);
        ans.clear();
        Lca(u, v);
        ll res = 0ll;
        for (int i = BIT; ~i; i --)
            if ((res ^ ans.p[i]) > res) res ^= ans.p[i];
        cout << res << endl;
    }
    return 0;
}

「洛谷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. QT获取本机IP和Mac地址

    #include <QNetworkInterface> #include <QList> void MainWindow::getIPPath() { QString str ...

  2. Oracle database link中查询会开启事务吗?

    关于oracle database link,使用database link相关的查询语句是否会开启事务呢?我们知道,在数据库中一个简单的SELECT查询语句不会产生事务(select for upd ...

  3. Linux系统下virtuoso数据库安装与使用

    最近在调研关联数据的一些东西,需要用到rdf数据库,所以接触了virtuoso数据库.安装的坑其实并不多,之前在windows 10上安过一次.这次在ubuntu 18.04上安装一下,其他的linu ...

  4. Redhat安装Oracle 11g (转)

    1.1     安装前准备 1.1.1     修改操作系统核心参数 在Root用户下执行以下步骤: 1.1.1.1 修改/etc/security/limits.conf文件 输入命令:vi /et ...

  5. Seattle Traffic construction projects punlication

    Why are we making this changes? Construction projects will close some transit facilities to buses in ...

  6. 【Python 13】分形树绘制1.0--五角星(turtle库)

    1.案例描述 2.案例分析 引入绘制图形的turtle库,利用库中函数进行编程. 3.turtle库 没有显示的input()和output(),没有赋值语句.调用形式大部分如下: import tu ...

  7. day 1总结-python基础

    第一天的复习 目录:1.编程语言的区分 2.python的优缺点 3.python环境的搭建,版本之间的大致区别 4.代码的注释规则 5.变量 6.常量 7.基本程序交互 8.基础数据类型 9.基础循 ...

  8. spring boot拦截器WebMvcConfigurerAdapter,以及高版本的替换方案(转)

    文章转自 http://blog.51cto.com/12066352/2093750 最近项目采用spring icloud,用的spring boot版本是1.5.x的,spring boot 2 ...

  9. uWSGI、WSGI和uwsgi

    WSGI wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 djang ...

  10. Ubuntu 14.04 结束支持该如何应对?

    Ubuntu 14.04 即将于 2019 年 4 月 30 日结束支持.这意味着在此日期之后 Ubuntu 14.04 用户将无法获得安全和维护更新. 你甚至不会获得已安装应用的更新,并且不手动修改 ...