题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1 x y 查询节点x的子树中与y异或结果的最大值 2 x y z 查询路径x到y上点与z异或结果最大值 输入 第一行是两个数字n, Q; 第二行是n个数字用空格隔开,第i个数字vi表示点i上的权值 接下来n-1行,每行两个数,x,y,表示节点x与y之间有边 接下来Q行,每一行为一个查询,格式如上所述. 1 < n, Q ≤ 100000 ,查询1中的y ≤ 2…
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对dfs序建可持久化的trie树.这样做的空间复杂度是O(nw),时间复杂度是O(nw). 代码: #include<bits/stdc++.h> using namespace std; ; int n,q; int v[maxn]; vector<int> g[maxn]; vecto…
题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. 2 x y z :查询路径 x到 y 上点与 z 异或结果最大值 输入格式 第一行是两个数字 n , Q . 第二行是 n 个数字用空格隔开,第 i 个数字 \(v_i\) 表示点 i 上的权值. 接下来 n−1 行,每行两个数, x,y ,表示节点 x 与 y 之间有边. 接下来 Q 行,每一行…
强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int tot,edges,tim; int cnt[N*33],ch[N*33][2],tree[N],seq[N],val[N],ba[N]; int fa[N],son[N],size[N],t…