[bzoj4568][树上倍增][线性基]幸运数字

HyperMesh 2025新功能尝鲜:用Volume Tetramesh一键生成工业级四面体网格 HyperMesh 2025推出的Volume Tetramesh功能,通过“体到体”的全新范式,实现了工业级四面体网格的一键生成。该功能利用Proximity与Curvature参数智能识别并加密几何特征,将工程师从繁琐的几何清理和表面网格划分中解放出来,在保证网格质量的同时,显著提升了前处理效率,尤其适用于发动机缸体等复杂模型的仿真分析。 阅读详情

Description

A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个
幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划 乘飞机降落在 x 号城市,沿着 x
号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。
在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸
运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。例如, 游览者拍了 3 张照片,幸运值分别是
5,7,11,那么最终保留在自己身上的幸运值就是 9(5 xor 7 xor 11)。
有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 5 和 11 ,可以保留的幸运值为 14
。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中 可以保留的最大幸运值是多少。

Input

第一行包含 2 个正整数 n ,q,分别表示城市的数量和旅行者数量。第二行包含 n 个非负整数,其中第 i 个整 数 Gi 表示 i
号城市的幸运值。随后 n-1 行,每行包含两个正整数 x ,y,表示 x 号城市和 y 号城市之间有一 条道路相连。随后 q
行,每行包含两个正整数 x ,y,表示这名旅行者的旅行计划是从 x 号城市到 y 号城市。N
<=20000,Q<=200000,Gi<=2^60

Output

输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。

Sample Input

4 2

11 5 7 9

1 2

1 3

1 4

2 3

1 4

Sample Output

14

11

题解

全程%超级大佬
学了新东西线性基,可以用log(max(a[i]))的数表达出a[i]这个集合的异或值域
这题可以考虑树上倍增,倍增的时候暴力合并两个线性基
路径是唯一的所以就lca搞一下这个路径上的线性基,之后贪心地输出

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
    int x,y,next;
}a[41000];int len,last[21000];
void ins(int x,int y)
{
    len++;
    a[len].x=x;a[len].y=y;
    a[len].next=last[x];last[x]=len;
}
int n,fa[21000][21],dep[21000],q;
LL f[21000][21][65],bin[65];
void merge(LL *a,LL u)
{
    for(int i=60;i>=0;i--)
    {
        if((u&bin[i])!=0)
        {
            if(a[i]==0){a[i]=u;return ;}
            else u^=a[i];
        }
    }
}
void merge_all(LL *a,LL *b)
{
    for(int i=0;i<=60;i++)
        if(b[i]!=0)merge(a,b[i]);
}
void pre_tree_node(int x)
{
    for(int i=1;bin[i]<=dep[x];i++)
    {
        fa[x][i]=fa[fa[x][i-1]][i-1];
        memcpy(f[x][i],f[x][i-1],sizeof(f[x][i-1]));
        merge_all(f[x][i],f[fa[x][i-1]][i-1]);
    }
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        if(y!=fa[x][0])
        {
            fa[y][0]=x;
            dep[y]=dep[x]+1;
            pre_tree_node(y);
        }
    }
}
LL ans[65];
void sol(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    for(int i=20;i>=0;i--)if(dep[fa[x][i]]>=dep[y])merge_all(ans,f[x][i]),x=fa[x][i];
    if(x==y){merge_all(ans,f[x][0]);return ;}
    for(int i=20;i>=0;i--)if(bin[i]<=dep[x] && fa[x][i]!=fa[y][i])merge_all(ans,f[x][i]),merge_all(ans,f[y][i]),x=fa[x][i],y=fa[y][i];
    merge_all(ans,f[x][0]);merge_all(ans,f[y][0]);
    merge_all(ans,f[fa[x][0]][0]);
    return ;
}
int main()
{
    scanf("%d%d",&n,&q);
    bin[0]=1;for(int i=1;i<=60;i++)bin[i]=bin[i-1]*2;
    len=0;memset(last,0,sizeof(last));
    for(int i=1;i<=n;i++)
    {
        LL tmp;
        scanf("%lld",&tmp);
        merge(f[i][0],tmp);
    }
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        ins(x,y);ins(y,x);
    }
    fa[1][0]=0;dep[1]=1;pre_tree_node(1);
    while(q--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        memset(ans,0,sizeof(ans));
        sol(x,y);LL sum=0;
        for(int i=60;i>=0;i--)if((sum^ans[i])>sum)sum^=ans[i];
        printf("%lld\n",sum);
    }
    return 0;
}
Redhawk:什么是timing window? STA timing file中timing window的作用和计算方式 阅读详情

相关推荐

FPGA可重构技术

介绍FPGA 可重构技术的实现方法,包括全局重构和部分重构

航天领域资深码农,型号经验丰富,一线干货分享 1989

10.23 Bzoj 4568. [Scoi2016]幸运数字 (树上线性基+倍增)

10.23 Bzoj 4568. [Scoi2016]幸运数字 题意: 树上每个结点都有值,询问两点之间路径上的点,取任意点,使其异或和是最大的在这条路径上所有的异或和 解题思路: 树上线性基,利用倍增来实现 注意: c[i][j]代表i节点上的2^(j - 1)路径上的线性基,因为这是节点上的倍增,而不是以边为递增 AC代码: #include <bits/stdc++.h> using namespace std; const int maxn = 2e4 + 10; const int m

trouble_的博客 205

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

qq_45634989的博客 2878

线性基+树上倍增 ---- BZOJ4568[线性基+树上倍增]

题目链接 题目大意:就是给你一棵树,每个树上的节点都有一个权值,现在给你一个询问u和v问你这个路径上面挑任意几个数进行xor运算,问你xor最大值是多少 解题思路:对于每个点我们可以维护它向根节点上面走2i2^i2i次方步数的线性基的信息那么我们就可以在查询的时候往上跳,边跳边合并 #include<bits/stdc++.h> #define mid ((l + r) >> 1) #define Lson rt << 1, l , mid #define Rson

weixin_45630722的博客 221

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1380

Python 爬虫实战:豆瓣 / IMDB 电影数据抓取(评分 + 剧情 + 演员阵容结构化处理)

在数据为王的时代,电影数据是进行市场分析、推荐系统构建和学术研究的重要资源。豆瓣和 IMDB 作为国内外最具影响力的电影评分和资讯网站,包含了海量高质量的电影数据。本文将带领你从零开始,构建一个健壮的 Python 爬虫,用于抓取豆瓣和 IMDB 的电影信息,并将其中的非结构化数据(如剧情简介、演员列表)进行清洗和结构化处理,最终存储到便于分析的结构化文件(如 CSV)中。

yansideyucsdn的博客 956

hihocoder 1723 : 子树统计 (线性基)

描述给定一棵N个节点的有根树,树上每个节点有一个非负整数权重Wi。定义节点集合S={i1, i2, ……, ir}的总权重为:(⊕是异或运算)每次询问一棵子树内所有可能出现的总权重数量,即令E为所询问的子树内节点的集合,|T|即为可能出现的总权重数量。输入第一行包含两个整数N,Q,表示树的节点数目和询问数目,节点1总是这棵树的根部。第二行包含N-1个整数,第i个整数P_i表示i+1号节点的父亲节点...

SSimpLe_Y的博客 974

白话机器学习算法理论+实战番外篇之Xgboost

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 我前面已经尝试用最白话的语言完成了一个白话机器学习算法理论+实战系列,这个系列已经基本包含了上面这些算...

Miracle8070 1万+

幸运数字-线性基合并,倍增

P3292 题目描述 题解 代码 #include<bits/stdc++.h> #define int long long #define M 100001 using namespace std; int read(){ int f=1,re=0;char ch; for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar...

Daniel__d的博客 440

DISM进行系统修复,进度条卡在63.2%的解决方法

一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案

码农研究僧的博客 1万+

大模型技术全景与核心概念解析:从基础原理到AI智能体架构(实时更新中)

本文系统解析了大模型技术的核心概念与架构。首先介绍了LLM(大语言模型)、LLMOps(模型运维)、AIGC(生成内容)、AGI(通用AI)等基础概念,重点阐述了大模型的工作原理,包括预处理、推理和后处理三个阶段。深入讲解了Token分词、FLOPs计算、Embedding向量表示等关键技术,并分析了LoRA微调、MoE架构等前沿方法。文章还探讨了AI智能体的发展前景,为理解大模型技术提供了全景视角。

算法工程师 1244

bzoj4568 [Scoi2016]幸运数字(LCA+线性基)

题目链接 分析: 学长说这叫:树上线性基 有多重做法 (1)树链剖分+线性基合并(2)LCA+倍增+线性基合并(3)点分治+线性基合并 后两个是lognlognlogn级的,第一种是log2nlog2nlog^2n级的 就代码复杂度来说,当然是选择第二种方法啦 每个结点维护向上跳2i2i2^i步经过的数字的线性基 线性基的合并直接暴力即可 最后的统计答案就是普通的线性基求异或和最...

Coco_T的博客 352

《FreeRTOS 入门与实战》第20章:移植到 RISC-V 平台

处理器上下文保存/恢复机制中断处理与任务切换的协同时钟源配置(通常使用 Machine Timer)平台特定的汇编代码实现// 典型RISC-V移植文件结构FreeRTOS/├── Source/portable/[编译器]/RISC-V/│ ├── port.c // 关键移植接口│ ├── portASM.s // 汇编级处理│ └── portmacro.h // 架构宏定义。

2301_79143213的博客 450

【bzoj4568】【SCOI2016】【幸运数字】【树上倍增+线性基】

Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划 乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。 在经过每一座城市时,游览者就会有

sunshinezff的专栏 977

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Bzoj4568: [Scoi2016]幸运数字

Bzoj4568: [Scoi2016]幸运数字 线性基+倍增+LCA 原来线性基还能这么考……一开始看到这个题以为是树上差分线性基,然而线性基不支持删除,所以就挂了。 后来想到倍增线性基,其实到这里思路就很清晰了。 倍增线性基,A[i][j]表示从i开始向上2j步的线性基,询问时暴力合并即可。 1 xxj hb(xxj a,xxj b) 2 { 3 xx...

weixin_30369087的博客 101

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BZOJ4568 [Scoi2016]幸运数字 树上倍增+线性基

有一棵NNN个节点的树,QQQ个询问,每次询问树上从uuu到vvv的路径中能xorxorxor出的最大值。N≤20000,Q≤200000,N≤20000,Q≤200000,N\leq20000,Q\leq 200000,时限666s. 询问一个数集的xorxorxor最大值显然线性基模板。 预处理树上每个点到它第2k−12k−12^k-1个父亲的线性基,合并时暴力将一个线性基插入另一个,每次...

Wolf_Reiser的博客 444

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

bzoj4568 [Scoi2016]幸运数字(树上倍增+线性基)

多次询问路径权值集合的子集的最大异或和。 很容易想到线性基。 我们树上倍增跳lca的同时,暴力合并出我们的线性基即可。 复杂度O(nlogn602+mlogn602)O(nlogn60^2+mlogn60^2) 按道理应该过不去,不过可以卡过去qaq 可以考虑写st表去掉一个logn。tips:人生一大悲痛,原来我一直写的倍增是有问题的qaq,注意那个预处理时的跳倍增的i,我一直以为写成n

Icefox的博客 317

【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)

Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。在经过每一座城市时,游览者就会有机会与这...

weixin_30827565的博客 98

bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)

4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 1692  Solved: 643 [Submit][Status][Discuss] Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个 幸运数字,以纪念碑的

加载中... 556

【BZOJ4568】幸运数字(SCOI2016)-树上倍增+异或线性基合并

测试地址:幸运数字 做法:本题需要用到树上倍增+异或线性基合并。 我们发现,每次询问都是求从一条路径上选一个子集,使得这个子集的异或和最大。如果只有一个询问,那敢开这题的大家肯定都会O(60n)O(60n)O(60n)的线性基+贪心做法,问题是有qqq个询问,暴力做显然会炸,所以需要找到优化的方法。 我们发现只要求出了对应向量空间的线性基,那么求最大异或和就是O(60)O(60)O(60)的...

Maxwei_wzj的OI世界 444

【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基

题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,...

weixin_30767921的博客 100

BZOJ4568 [Scoi2016]幸运数字

BZOJ4568 [Scoi2016]幸运数字 题目描述 传送门 题目分析 这个题,求树上链的\(XOR\)最大值,可以不选某些点。 考虑到线性基可以用很快的速度求出\(XOR\)的最大值,我们首先可以确定使用线性基来搞定这个题的询问。 然后可以考虑用树剖解决,发现一个问题,使用树剖时,由于一边跳一遍计算线性基,还要合并,复杂度比较高,虽然的确可以通过本题,但是明显可以通过随便增大数据就卡死了。...

weixin_30835649的博客 114

bzoj4568【SCOI2016】幸运数字

树上倍增+线性基

AaronPolaris 2902

[BZOJ4568]幸运数

[BZOJ4568]幸运数 线性基+倍增暴力维护 好难啊难啊啊 给定一颗n个节点的树,每个点有一个权值\(a_i\),大小在\(2^{60}\)内,有q组询问,每次给定u,v,询问u到v的路径上的点的最大子集异或和。 最开始想的是莫队能不能搞一下,但是线性基怎么删除了,所以不可行。 那还能什么办法啊QAQ。处理树上路径问题,好用的就只剩倍增了吧。 这时候你可能会有质疑了...

Destiny 244

【bzoj4568】[Scoi2016]幸运数字 线性基+树链剖分

什么鬼东西呀? 就是把两个线性基合并的过程放在线段树上,倍增可做,反正我写的树剖,听说学校里某人在某次考试的考场上的O(nlogn)算法被O(nlog^2n)的树剖秒成渣了。 异或没打括号,调了好久。 #include #include #include #include #include #include #define maxn 20010 using namespace st

Oxer的专栏 1398
上一篇: [bzoj2426][贪心]工厂选址
下一篇: [bzoj3173][树状数组]最长上升子序列
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值