「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
【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+线性基+合并】的更多相关文章
- loj#2013. 「SCOI2016」幸运数字 点分治/线性基
题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「 洛谷 」P2768 珍珠项链
珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...
- 「 洛谷 」P4539 [SCOI2006]zh_tree
小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- 【bzoj4568 scoi2016】幸运数字
题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...
随机推荐
- 智能POS常见问题整理
智能POS预警值为小于所设的数量,H5就会变为锁定状态 智能POS查看数据库方法: 商米D1:设置-存储设备和USB-内部存储设备-浏览-winboxcash tablet.db为智能POS数据库 W ...
- Linux 环境 Intelij Idea 安装与快捷图标配置
索引: 目录索引 参看代码 GitHub: intelij-idea.txt 一.Linux (DeepinOS) 环境 1.官网下载 ideaIU-.tar.gz 2.解压 .tar.gz -C ~ ...
- Kubernetes 集群日志管理 - 每天5分钟玩转 Docker 容器技术(180)
Kubernetes 开发了一个 Elasticsearch 附加组件来实现集群的日志管理.这是一个 Elasticsearch.Fluentd 和 Kibana 的组合.Elasticsearch ...
- java.lang.NullPointerException一个低级的解决方法
java.lang.NullPointerException 这次因为调用了类的方法的时候忘记了new对象了 导致该对象为空
- Python爬虫之Beautiful Soup库的基本使用
- Canvas中的非零环绕
先上图 当要填充图形时,必须区分开哪些部分是覆盖的,哪些是空的,根据绘制的方向可以判断出来 非零环绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段,使此线段的完全落在路径范围之外. 非零 ...
- 删除网络中的本地连接*x等
1.运行-regedit 打开注册表 定位到 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Network {4D36E972-E325-11 ...
- centos7下kubernetes(18。kubernetes-健康检查)
自愈能力是容器的重要特性.自愈的默认方式是自动重启发生故障的容器. 用户还可以通过liveness和readiness探测机制设置更精细的健康检查,进而实现: 1.零停机部署 2.避免部署无效的镜像 ...
- Arduino内部网页代理,网页穿透,公网访问Arduino内部网页
#include <ESP8266WiFi.h> const char* id = "id"; //http://www.mcunode.com/proxy/ ...
- SpringMVC处理请求和返回流程
流程描述:一个url请求,找打指定的requestMapping再返回指定的jsp界面 通过url拿到指定的java方法 HandlerExecutionChain mappedHandler = ...