「洛谷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 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...
随机推荐
- spring学习总结——高级装配学习二(处理自动装配的歧义性)
我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...
- Word Count
Word Count 一.个人Gitee地址:https://gitee.com/godcoder979/(该项目完整代码在这里) 二.项目简介: 该项目是一个统计文件字符.单词.行数等数目的应用程序 ...
- MySQL5.5.51启用网络远程连接
在其它电脑主机上访问时提示host ip is not allowed to connect to this mysql 下面代码为解决该问题的方法: :\Program Files\mysql-\b ...
- 推荐一款关于MongoDB日志分析的工具--Mtools
一. 需求背景 MongoDB数据库的强大的文档模型使其成为处理数据的最佳方式.文档适用于广泛的流行数据模型,支持各种各样的场景.文档模型可以包含键值.关系数据集和图形数据集,当然,还可以包含父子关系 ...
- Linux中DHCP服务器的简单配置
我安装了两台linux系统,一个作为服务器,一个客户端 两个都有3个网卡, 后两个网卡聚合为zhi一个网卡:Linux 网卡聚合 两台电脑都一样. 那么如何为这个聚合网卡进行DHCP的分配呢? 1.由 ...
- Python语法教程-基础语法01
目录 1. Python应用 2. 在Linux中写python 3. Python基础语法 1. 注释 2. 变量定义及类型 3. 格式化输出 4. 用户输入 5. 运算符 6.数据转换 7. 判断 ...
- Spring boot admin 节点状态一直为DOWN的排查
项目中需要监控各个微服务节点的健康状态,找到了spring boot admin这个全家桶监控工具,它其实是Vue.js美化过的Spring Boot Actuator,官方的解释是: codecen ...
- 有效的字母异位词的golang实现
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 输入: s = "anagram", t = "nagaram" 输出: ...
- django-debug-toolbar使用指南
好久没发新博客,凑个数... django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面 ...
- SpringBoot四大神器之Actuator
介绍 Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供 ...