当前位置: 首页 > news >正文

P4592 [TJOI2018] 异或 - Link

题意

一棵\(n\) 个点的有根树,每个点有点权,\(q\) 次询问,分为两种:

  1. 1 x z:查询节点 \(x\) 的子树中的节点权值与 \(z\) 异或结果的最大值。
  2. 2 x y:查询节点 \(x\) 到节点 \(y\) 的简单路径上的节点的权值与 \(z\) 异或结果最大值。

\(n,q\le10^5\)

思路

使用可持久化字典树维护。

操作 \(1\)

用版本号表示 \(dfn\) 序,维护一下每个点被经过了几次,查询直接两个版本次数相减,判断是否大于 \(0\)

操作 \(2\)

用版本号表示点,每个点从祂父亲的版本更新,查询时找一下 \(lca\),其祂和操作 \(1\) 一样。

代码

// Problem: P4592 [TJOI2018] 异或
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4592
// Memory Limit: 250 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=100010;
int n,q,val[maxn],fa[maxn][30],deep[maxn],dfn[maxn],cnt_dfn,en[maxn],o[maxn];
vector<int>e[maxn];
class Trie{
private:struct node{int ch[2],cnt;}t[maxn*32];int rt[maxn],cnt;
public:void insert(int id,int pre,int val){rt[id]=++cnt;int u=rt[id],uu=rt[pre];for(int i=30;i>=0;i--){int ch=!!(val&(1<<i));t[u].ch[!ch]=t[uu].ch[!ch];t[u].ch[ch]=++cnt;u=t[u].ch[ch],uu=t[uu].ch[ch];t[u].cnt=t[uu].cnt+1;}}int query(int l,int r,int val){int u=rt[r],uu=rt[l],ans=0;for(int i=30;i>=0;i--){int ch=!(val&(1<<i));if(t[t[u].ch[ch]].cnt-t[t[uu].ch[ch]].cnt) u=t[u].ch[ch],uu=t[uu].ch[ch],ans|=(1<<i);else u=t[u].ch[!ch],uu=t[uu].ch[!ch];}return ans;}
}t1,t2;
void dfs(int u){dfn[u]=++cnt_dfn;o[cnt_dfn]=u;t1.insert(u,fa[u][0],val[u]);deep[u]=deep[fa[u][0]]+1;for(int i=1;i<=17;i++) fa[u][i]=fa[fa[u][i-1]][i-1];for(int v:e[u]){if(v==fa[u][0]) continue;fa[v][0]=u;dfs(v);}en[u]=cnt_dfn;
}
int lca(int u,int v){if(deep[u]<deep[v]) swap(u,v);for(int i=17;i>=0;i--) if(deep[fa[u][i]]>=deep[v]) u=fa[u][i];if(u==v) return u;for(int i=17;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];return fa[u][0];
}
signed main(){read(n,q);for(int i=1;i<=n;i++) read(val[i]);for(int i=1;i<n;i++){int u,v;read(u,v);e[u].push_back(v),e[v].push_back(u);}dfs(1);for(int i=1;i<=n;i++) t2.insert(i,i-1,val[o[i]]);for(int i=1;i<=q;i++){int op,x,y,z;read(op,x);if(op==1){read(z);write(t2.query(dfn[x]-1,en[x],z));}else{read(y,z);int l=lca(x,y);write(max(t1.query(fa[l][0],x,z),t1.query(fa[l][0],y,z)));}write("\n");}return 0;
}
http://www.jsqmd.com/news/720907/

相关文章:

  • 20254121 2025-2026-2 《Python程序设计》实验3报告
  • 开源色彩管理革命:OpenColorIO配置为ACES的终极指南
  • 别再只抄代码了!手把手教你用逻辑分析仪调试STM32与DS1302的SPI时序
  • LongWayToGo
  • 终极风扇控制指南:告别噪音与过热的专业解决方案
  • 成都二手上下铁床供应商|十年工厂,员工宿舍高低床/工地双层床/可定制 - 企业推荐师
  • 降AI怎么花钱才不冤枉?按学校要求+预算4种情况分类推荐工具! - 我要发一区
  • 萌宝成长助手,轻松带娃
  • 嘎嘎降的1000字免费试用够不够看出效果?万字论文实测拆解! - 我要发一区
  • 成都二手上下铁床厂家|自有工厂,全新二手上下铺铁架床 批量供货 - 企业推荐师
  • 如何用Faster-Whisper-GUI实现高效音频视频转文字
  • 为什么你的Swoole-LLM服务上线3天就OOM?揭秘内存管理、协程调度、流控熔断的4层防护架构
  • ChatGPT机器人集成实战:从API调用到生产级对话系统构建
  • LLM作为AI对话评估裁判的实践与优化
  • 英语阅读_The global fashion industry
  • 别再用手工测接口了,Python 脚本帮你自动跑回归
  • Pandas可视化
  • 英语阅读_not wise to follow every trend blindly
  • oh-my-codex 简介(Codex免费使用方法)
  • 苹果微软双修党福音:Navicat如何熟悉Mac版专属快捷键_硬核实战技巧
  • 保姆级教程:Ubuntu 20.04/18.04系统下Atlas 300i Pro/T 芯片驱动、CANN 6.3.RC1及MindSpore 2.0环境配置详解
  • Win11笔记本耳机没弹窗?手把手教你修复Realtek Audio Console的RPC连接问题
  • 两个线程循环打印奇偶数
  • 禾川HCQ0-1100-D PLC从开箱到跑通第一个CANopen轴:Codesys配置避坑全记录
  • 英语阅读_How can we develop our own style
  • 017、PCIe数据包结构:TLP、DLLP与Ordered Sets
  • 如何在OBS中实现专业级面部跟踪?2025最新插件完整指南
  • Claude Pulse:实时监控AI编程助手请求的VS Code扩展
  • Kimi K2.6 + Claude 多代理路由栈
  • 算法训练营第十六天 | 反转字符串 II