P3292 [SCOI2016] 幸运数字

news/2025/2/7 18:39:41/文章来源:https://www.cnblogs.com/LG017/p/18703090

[SCOI2016] 幸运数字

题目描述

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

一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 \(x\) 号城市,沿着 \(x\) 号城市到 \(y\) 号城市之间那条唯一的路径游览,最终从 \(y\) 城市起飞离开 A 国。在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。

例如,游览者拍了 \(3\) 张照片,幸运值分别是 \(5, 7, 11\),那么最终保留在自己身上的幸运值就是 \(5 \operatorname{xor} 7 \operatorname{xor} 11 = 9\)

有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 \(5\)\(11\) ,可以保留的幸运值为 \(14\) 。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中可以保留的最大幸运值是多少。

提示

对于 \(100 \%\) 的数据,保证 \(n \leq 2 \times 10^4, q \leq 2 \times 10^5, G_i \leq 2^{60}\)

Solution:

我们知道线性基是可以合并的,我们先对于每个点记录该点到根这条路径上所有点构成的线性基,但在插入时,对于相同的位,我们优先取更深的那个点,那么我们在从这个树上取出一条路径上的线性基时,直接判断这个点的深度是否大于 lca 然后我们就能取出这条路径上的线性基,直接最大化答案就好了。

Code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+5;
const int inf=65;
const int lg=15;
int n,m,e_cnt;
int head[N],a[N],dep[N],base[inf];
int d[N][inf],pos[N][inf],fa[N][inf];
struct Edge{int to,nxt;
}e[N<<1];
void add(int x,int y)
{e[++e_cnt]={y,head[x]};head[x]=e_cnt;
}
void ins(int x,int d[],int pos[])
{int v=a[x];for(int i=60;i>=0;i--){if(v&(1ll<<i)){if(!d[i]){d[i]=v;pos[i]=x;break;}if(dep[x]>dep[pos[i]]){swap(x,pos[i]);swap(d[i],v);}v^=d[i];}}
}
void dfs(int x)
{dep[x]=dep[fa[x][0]]+1;for(int i=1;i<=lg;i++){fa[x][i]=fa[fa[x][i-1]][i-1];}for(int i=0;i<=60;i++){pos[x][i]=pos[fa[x][0]][i];d[x][i]=d[fa[x][0]][i];}ins(x,d[x],pos[x]);for(int i=head[x];i;i=e[i].nxt){int to=e[i].to;if(to==fa[x][0])continue;fa[to][0]=x;dfs(to);}
}
int LCA(int x,int y)
{if(dep[x]<dep[y])swap(x,y);for(int i=lg;i>=0;i--){if(dep[fa[x][i]]>=dep[y])x=fa[x][i];}if(x==y)return x;for(int i=lg;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];
}
int ANS(int x,int y,int lca)
{for(int i=60;i>=0;i--){if(dep[pos[x][i]]>=dep[lca]){base[i]=d[x][i];}else base[i]=0;}for(int i=60;i>=0;i--){if(dep[pos[y][i]]>=dep[lca]){int p=d[y][i];if(!p)continue;for(int j=i;j>=0;j--){if(p&(1ll<<j)){if(!base[j]){base[j]=p;break;}p^=base[j];}}}}int ans=0;for(int i=60;i>=0;i--){ans= (ans^base[i])>ans ? ans^base[i] : ans;}return ans;
}
void work()
{cin>>n;cin>>m;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}for(int i=1,x,y;i<n;i++){scanf("%lld%lld",&x,&y);add(x,y);add(y,x);}dfs(1);for(int i=1,x,y;i<=m;i++){scanf("%lld%lld",&x,&y);int lca=LCA(x,y);int ans=ANS(x,y,lca);printf("%lld\n",ans);}
}
#undef int 
int main()
{	//freopen("P3292_1.in","r",stdin);freopen("P3292.out","w",stdout);work();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880160.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型时代的软件进化论:恐龙式软件 vs. 猴群式软件

春节期间,IT圈内两件大事持续发酵,一件是中国大模型DeepSeek R1的开源震动全球AI界,让中国科技界扬眉吐气,廉价大模型走入千家万户;另一件是SAP被客户居然之家告上法庭,要求索赔590万开发费用和1700万软件费用,最终法院判SAP退还350万研发费用。这两件事的背后,实际上映…

xtrabackup 命令备份

Percona XtraBackup 安装下载地址: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-32/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.35-32.1.el8.x86_64.rpm 官方YUM安装说明: Percona 版本和 YUM - Percona XtraBackup在…

React—03—类组件中事件处理函数的this绑定、事件处理函数的传参;jsx的条件判断渲染;jsx的循环渲染

零、如何给html元素加事件监听 1.原生方式:通过querySelector()方法,捕捉到元素,比如说button元素,然后通过btn.onclick = () =>{}或者通过btn.addEventListensers(click, ()=>{})的方式 2.vue的方式,在元素上使用v-on指令,比如@click 3.react方式,在元素上使用事…

巧用通义灵码,提升前端研发效率

本次分享,主题是利用通义灵码提升前端研发效率。分享内容主要包括以下几部分:首先,我将从前端开发的角度介绍对通义灵码的基本认识;其次,我将展示通义灵码在日常研发中的应用案例;然后,我将通过实例说明,良好的设计能够显著提升通义灵码的效果。在第四个部分,我将介绍…

linux服务器离线安装ollama

一、前言 公司服务器在线安装ollama总是超时连接不上,想着本质就是个安装包,离线安装也可以。固有了这样的一篇博客记录一下。 二、流程 1、查看服务器cpu架构 执行指令 lscpu# x86_64 CPU选择下载ollama-linux-amd64 # aarch64|arm64 CPU选择下载ollama-linux-arm642、下载对…

数字孪生与智慧工厂完美融合,推动智能制造新时代

随着工业4.0和智能制造的浪潮席卷全球,数字孪生技术成为了现代工业发展的重要驱动力。数字孪生,作为一种能够在虚拟环境中精确再现物理实体的技术,通过实时数据的流动和反馈,创建了一个高度仿真的“数字模型”,而这一模型不仅仅停留在静态的模拟阶段,而是与现实世界保持实…

【字符串处理之sscanf函数】读入HH:MM:SS:NN型时间;读入日期

读取时间 HH:MM:SS:NN型 函数 //转为毫秒表示,方便比大小 int get(string time) {int h, m, s, ms;//从字符串内读数据sscanf(time.c_str(), "%d:%d:%d.%d", &h, &m, &s, &ms);return h * 3600000 + m * 60000 + s * 1000 + ms; }样例1 输入 3 23:4…

【字符串处理sscanf】读入HH:MM:SS:NN型时间

读取时间 HH:MM:SS:NN型 函数 //转为毫秒表示,方便比大小 int get(string time) {int h, m, s, ms;//从字符串内读数据sscanf(time.c_str(), "%d:%d:%d.%d", &h, &m, &s, &ms);return h * 3600000 + m * 60000 + s * 1000 + ms; }样例1 输入 3 23:4…

如何阅读一本书

明确自己阅读的目的扩充知识:期望扩充哪方面的知识呢 研究他人的方法论? 深挖某些知识点?当前看的内容是否合适? 应用方法论SQ3R 阅读法Survey (预览): 快速浏览标题、目录、摘要等,了解文章或书籍的大意。 Question (提问): 对内容提出问题,带着问题阅读能提高理解力。 …

【转载】在windows下vscode终端里无法运行脚本解决方案

windows下使用vscode中的终端运行脚本出现以下的问题解决方案: 以管理员身份打开vscode,任意打开一个终端 在终端中输入get-ExecutionPolicy,若返回Restricted,说明现在是vscode是被禁止运行脚本 输入set-ExecutionPolicy RemoteSigned 这段命令 再看看现在的状态,输入 ge…

(转!)A卡玩转Stable Diffusion

转:https://www.fujieace.com/ai/amd-stable-diffusion.html今天,一位网友通过查看“设备管理器”,发现他的显卡是“AMD Radeon RX 580 2048SP”。因此,Stable Diffusion用显卡却怎么也跑不起来?一生成图片就报错误“rocBLAS error: Could not initialize Tensile library…

心脏支架 All In One

心脏支架 All In One心脏支架 All In One 冠状动脉成形术和支架植入术 冠状动脉成形术和支架置入术又称为经皮冠状动脉介入治疗。心脏支架副作用https://www.mayoclinic.org/zh-hans/tests-procedures/coronary-angioplasty/about/pac-20384761 demos(🐞 反爬虫测试!打击盗版…