news 2026/8/14 6:55:31

洛谷 P5556 圣剑护符 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P5556 圣剑护符 题解

题目概括:

给定一棵n nn个节点的树,每个节点有一个初始权值v i v_ivi(范围为[ 0 , 2 30 ) [0, 2^{30})[0,230))。需要处理q qq
次操作,操作分为两种:

  1. 修改操作Update x y z:将节点x xxy yy的简单路径上所有节点的权值异或上z zz
  2. 查询操作Query x y:询问从节点x xxy yy的简单路径上的所有节点权值组成的集合中,是否存在两个不相等的子集(子集指节点集合的子集,空集也包含在内),使得这两个子集中所有节点权值的异或和相等。如果存在输出
    YES,否则输出NO

问题等价于:判断路径上的所有节点权值在异或意义下是否线性相关(即是否存在一个非空子集的异或和为0 00)。由于权值位数不超过30 3030,若路径长度大于30 3030,根据鸽巢原理必然线性相关,答案一定为YES;否则需要实际检查这些权值是否线性相关。
From DeepSeek

简单来说,你需要实现的是:对于一颗树,你需要实现快速的单链异或+单点查询。

那我们如果想快速完成操作,就想到把修改的东西放到一个区间内,用线段树维护这样一段区间的复杂度时O ( log ⁡ 2 n ) O(\log_2 n)O(log2n)的。那如何把一条链放到一个区间内呢?

树链剖分!

考虑一下,如果我们在进行重链剖分的同时计算 DFS 序,那么同一条重链上的结点的时间戳一定是连续的。

所以修改的时候,我们用类似求 LCA 的方法进行操作,每次更新这条重链时间戳所对应的区间,然后跳到当前链链头的父亲。

这样我们就在O ( log ⁡ 2 n ) O(\log_2 n)O(log2n)处理了一个区间,而树链剖分在最坏情况下会有log ⁡ 2 n \log_2 nlog2n个区间,所以插入的时间复杂对时O ( log ⁡ 2 2 n ) O(\log_2^2n)O(log22n)级别的。

考虑查询。这里用到一个 trick。如果集合的规模很大,那么答案必然有解。这道题,树上所有结点的权值小于2 30 2^{30}230,这意味着如果在31 3131个里面选择一些,一共有2 31 2^{31}231种方案,根据抽屉原理,必然有一种满足要求的方案。

对于l e n ≤ 30 len \le 30len30的部分来说,考虑异或空间线性基的性质,显然基中不能出现异或值为0 00的数。这意味着有两个方法表示同一个数。故一定有方法使两个子集的异或和相同。

#include<bits/stdc++.h>#definels(p<<1)#definers(p<<1|1)usingll=longlong;constexprintN=1e5+5;std::vector<int>adj[N];structSegment_Tree{structNode{intnum,l,r;inttag;}t[N<<2];voidbuild(intp,intpl,intpr){t[p].l=pl;t[p].r=pr;t[p].num=t[p].tag=0;if(pl==pr)return;intmid=pl+pr>>1;build(ls,pl,mid);build(rs,mid+1,pr);}voidpush_down(intp){if(t[p].tag){t[ls].tag^=t[p].tag;t[ls].num^=t[p].tag;t[rs].tag^=t[p].tag;t[rs].num^=t[p].tag;t[p].tag=0;}}voidupdate(intp,intl,intr,intval){if(t[p].l>r||t[p].r<l)return;if(l<=t[p].l&&t[p].r<=r){t[p].num^=val;t[p].tag^=val;return;}push_down(p);update(ls,l,r,val);update(rs,l,r,val);}intquery(intp,intpos){if(t[p].l==t[p].r)returnt[p].num;push_down(p);intmid=t[p].l+t[p].r>>1;if(pos<=mid)returnquery(ls,pos);elsereturnquery(rs,pos);}voidprint(intp){if(t[p].l==t[p].r)std::cout<<t[p].num<<" ";elsepush_down(p),print(ls),print(rs);}}tree;intfa[N],dep[N],siz[N],top[N],dfn[N],v[N];inttim;voiddfs1(intu,intf){fa[u]=f;dep[u]=dep[f]+1;siz[u]=1;for(intv:adj[u]){if(v!=f){dfs1(v,u);siz[u]+=siz[v];}}}voiddfs2(intu,intf){top[u]=f;dfn[u]=++tim;intmx=-1,s=-1;tree.update(1,tim,tim,v[u]);for(intv:adj[u]){if(v!=fa[u]&&siz[v]>mx){mx=siz[v];s=v;}}if(s!=-1)dfs2(s,f);for(intv:adj[u]){if(v!=fa[u]&&v!=s)dfs2(v,v);}}voidupdate(intx,inty,intval){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])std::swap(x,y);tree.update(1,dfn[top[x]],dfn[x],val);x=fa[top[x]];}if(dfn[x]>dfn[y])std::swap(x,y);tree.update(1,dfn[x],dfn[y],val);}intlca(intu,intv){while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])v=fa[top[v]];elseu=fa[top[u]];}if(dep[u]<dep[v])returnu;returnv;}constexprintM=31;structleaner_basis{intb[M];voidinit(){memset(b,0,sizeofb);}boolinsert(intx){for(inti=M-1;i>=0;i--){if(!(x&(1<<i)))continue;if(!b[i]){b[i]=x;return1;}x^=b[i];}returnfalse;}}basis;intn,q,x,y,z;intmain(){std::cin>>n>>q;for(inti=1;i<=n;i++)std::cin>>v[i];for(inti=1;i<n;i++){intu,v;std::cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);}tree.build(1,1,n);dfs1(1,0);dfs2(1,1);while(q--){std::string s;std::cin>>s>>x>>y;if(s[0]=='U'){std::cin>>z;update(x,y,z);}else{intl=lca(x,y);intdis=dep[x]+dep[y]-2*dep[l]+1;if(dis>30)std::cout<<"YES\n";else{basis.init();boolflag=false;if(!basis.insert(tree.query(1,dfn[l])))flag=1;if(!flag)while(x!=l){if(!basis.insert(tree.query(1,dfn[x]))){flag=1;break;}x=fa[x];}if(!flag)while(y!=l){if(!basis.insert(tree.query(1,dfn[y]))){flag=1;break;}y=fa[y];}std::cout<<(flag?"YES\n":"NO\n");}}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 12:20:46

Spring AI 最新实战系列(一)完成一个简单的AI项目

使用前介绍 我们以 Alibaba 的百炼平台作为Spring-AI的模型讲解&#xff0c;以最新稳定版作为架构。 spring-ai 的最新版本 1.1.2 &#xff1b;alibaba-spring-ai 的最新版本 1.1.0.0-RC1。 需要注意一点&#xff1a;最新版本的 Spring Boot 4.0.0 不能适配&#xff0c;需要降低…

作者头像 李华
网站建设 2026/8/13 12:58:52

LobeChat智谱ChatGLM接入全流程:Zhipu AI API对接

LobeChat 智谱 ChatGLM 接入全流程&#xff1a;Zhipu AI API 对接 在智能对话系统快速普及的今天&#xff0c;越来越多企业和开发者希望构建既具备专业能力又符合本地化需求的 AI 助手。然而&#xff0c;直接使用境外大模型服务常面临中文表达生硬、数据出境合规风险、网络延迟…

作者头像 李华
网站建设 2026/8/12 10:55:12

EmotiVoice能否实现语音情感渐变过渡?动态控制探索

EmotiVoice能否实现语音情感渐变过渡&#xff1f;动态控制探索 在虚拟偶像直播中&#xff0c;一个角色从担忧到释然的语气转变&#xff0c;往往只需一句话的时间&#xff1b;在互动游戏中&#xff0c;NPC因玩家行为瞬间由温和转为愤怒——这些细腻的情感流动&#xff0c;早已超…

作者头像 李华
网站建设 2026/8/13 16:01:59

终极微博备份指南:Speechless免费工具完整使用教程

终极微博备份指南&#xff1a;Speechless免费工具完整使用教程 【免费下载链接】Speechless 把新浪微博的内容&#xff0c;导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在信息碎片化的今天&#xff0c;微博承…

作者头像 李华
网站建设 2026/8/13 21:30:48

暗黑破坏神2存档编辑器终极指南:从零基础到精通进阶

暗黑破坏神2存档编辑器终极指南&#xff1a;从零基础到精通进阶 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经为暗黑破坏神2中的角色Build优化而苦恼&#xff1f;是否想要快速测试不同装备组合的效果却受限于漫长的…

作者头像 李华
网站建设 2026/8/12 12:15:06

LobeChat Google Gemini Pro接入方法:多模态能力整合

LobeChat 与 Google Gemini Pro 的多模态整合实践 在生成式 AI 快速演进的今天&#xff0c;用户对智能助手的期待早已超越“能聊天”的基本功能。我们不再满足于仅用文字提问、等待文本回复——而是希望上传一张产品截图就能获得详细分析&#xff0c;或是拖入一份 PDF 合同便能…

作者头像 李华