题目链接

loj

luogu

题意

求树上路径最大点权异或和

自然想到(维护树上路径)+ (维护最大异或和)

那么有三种方法可以选择

1.树剖+线性基

2.倍增+线性基

3.点分治+线性基

至于线性基的合并

一共就是long级的

暴力合并就好啦

这是一份在loj T掉在洛谷AC的可怜代码

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int N = 2e4 + 2;
const int LIM = 60; inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
} struct Edge{
int v, next;
}edge[N << 1];
int esize, head[N];
inline void addedge(int x, int y){
edge[++esize] = (Edge){y, head[x]};
head[x] = esize;
} struct XXJ{
long long w[LIM + 2];
XXJ(){
memset(w, 0, sizeof(w));
}
void ins(long long x){
for(int i = LIM; ~i; --i){
if(!(x >> i)) continue;
else if(!w[i]){w[i] = x; break;}
x ^= w[i];
}
}
void print(){
long long res = 0;
for(int i = LIM; ~i; --i)
if((res ^ w[i]) > res) res ^= w[i];
printf("%lld\n", res);
}
}px[N][18];
long long w[N];
int p[N][18], dep[N];
int n, m; XXJ merge(XXJ x, XXJ y){
for(int i = LIM; i >= 0; --i){
if(y.w[i]) x.ins(y.w[i]);
}
return x;
} XXJ LCA(int x, int y){
XXJ res;
res.ins(w[x]); res.ins(w[y]);
if(dep[x] < dep[y]) swap(x, y);
for(int i = 15; i >= 0; --i)
if(dep[x] - (1 << i) >= dep[y]){
res = merge(res, px[x][i]);
x = p[x][i];
}
if(x == y) return res;
for(int i = 15; i >= 0; --i){
if(p[x][i] != p[y][i]){
res = merge(res, px[x][i]);
res = merge(res, px[y][i]);
x = p[x][i], y = p[y][i];
}
}
res = merge(res, px[x][0]);
return res;
} void dfs(int x, int ff){
dep[x] = dep[ff] + 1;
p[x][0] = ff;
px[x][0].ins(w[ff]);
for(int i = head[x], vv; ~i; i = edge[i].next){
vv = edge[i].v; if(vv == ff) continue;
dfs(vv, x);
}
} void calc(){
for(int i = 1; i <= 15; ++i){
for(int j = 1; j <= n; ++j){
p[j][i] = p[p[j][i - 1]][i - 1];
px[j][i] = merge(px[j][i - 1], px[p[j][i - 1]][i - 1]);
}
}
} int main() {
memset(head, -1, sizeof(head)); scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%lld", &w[i]);
}
for(int i = 1, x, y; i < n; ++i){
scanf("%d%d", &x, &y);
addedge(x, y); addedge(y, x);
}
dfs(1, 0);
calc();
for(int i = 1, x, y; i <= m; ++i){
x = read(), y = read();
XXJ res = LCA(x, y);
res.print();
}
return 0;
}

SCOI2016幸运数字(树剖/倍增/点分治+线性基)的更多相关文章

  1. [SCOI2016]幸运数字 树链剖分,线性基

    [SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...

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

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

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

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

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

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

  5. 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字

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

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

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

  7. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基

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

  8. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

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

  9. [SCOI2016]幸运数字(线性基,倍增)

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

随机推荐

  1. Python—randonm模块介绍

    random是python产生伪随机数的模块 >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random ...

  2. Open Live Writer安装教程

    配置步骤: 1.在菜单中选择"工具">"帐户",出现下面的画面: 2.点击"添加按钮",在出现的窗口中选择"其他日志服务&q ...

  3. c++局部变量在外可用的方法

    C++的局部变量在作用域结束后,一般都会被回收.如下面这段代码 map<a*, b*> _map; void fun() { a _a; b _b; _map[&_a] = &am ...

  4. snappy

    Snappy 是一个 C++ 的用来压缩和解压缩的开发包.其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率.Snappy 比 zlib 更快,但文件相对要大 % 到 ...

  5. echarts使用笔记五:echarts的Zoom控件

    option = { title: { text: '趋势' }, tooltip : { trigger: 'axis', show:true, axisPointer : { // 坐标轴指示器, ...

  6. 【学亮IT手记】使用Map代替switch...case语句

  7. python之路--内置函数, 匿名函数

    一 . 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 字符串类型代码的执⾏ eval() 执⾏字符串类型的代码. 并返回最终结果( ...

  8. github & markdown & collapse & table

    github & markdown collapse & table https://github.com/Microsoft/TypeScript/issues/30034 GitH ...

  9. 微信小程序flex佈局

    聲明:display:flex 換行flex-wrap:flex-wrap:nowrap(不換行).wrap(換行).wrap-reserve(第一行在下面): 主軸對齊(橫向對齊)justify-c ...

  10. Java使用RabbitMQ之整合Spring(生产者)

    依赖包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.amq ...