SCOI2016幸运数字(树剖/倍增/点分治+线性基)
题目链接
题意
求树上路径最大点权异或和
自然想到(维护树上路径)+ (维护最大异或和)
那么有三种方法可以选择
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幸运数字(树剖/倍增/点分治+线性基)的更多相关文章
- [SCOI2016]幸运数字 树链剖分,线性基
[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字
板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
随机推荐
- H5上传图片之canvas
H5上传图片之canvas,使用canvas处理压缩图片再上传 html代码: <form action="" method="post"> < ...
- Applese 的毒气炸弹 G 牛客寒假算法基础集训营4(图论+最小生成树)
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 Applese 的毒气炸弹 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262 ...
- 自己实现数据结构系列五---BinarySearchTree
一.二分搜索树: 1.代码: public class BST<E extends Comparable<E>> { private class Node{ public E ...
- h5-语义化标签
###1.语义化标签 在h5之前,在开发过程中大量div的id名称重复,例如div id="footer"来标记页脚内容,所以html5元素引入了语义化标签(一组新的片段类元素) ...
- AngularJS集合数据遍历显示
AngularJS集合数据遍历显示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- Socket和ObjectOutputStream问题
用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接 用户代码 package com.jachs.ladflower.ladflower; import java.n ...
- VUE 处理文本框获焦点高亮
先贴例子代码 这里又三个div对应的三个input输入框 <!-- 登录的表单 --> <div class="input_group" :class=&quo ...
- Django--CRM--菜单展示, 删除合并, 权限展示
一 . 菜单展示 二 . 合并删除 我们可以把所有的删除都合并成一个函数这样就会减少很多的代码. 思路: 在url里面需要传两个参数,一个是要删的id 一个是名字 三 .权限展示 我们要实现两个功能 ...
- elasticsearch介绍,安装,安装错误解决及相应插件安装
一.elasticsearch介绍 1.简介(使用的是nosql,更新比mongodb慢): ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎, ...
- include与__autoload与命名空间namespace与PSR4详解
1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...