遇到水题了。贼嗨森。

题目传送门

题意简单,就不多解释了。

可持久化trie树模板*2,就A了。

第一棵树表示从根到该点,第二棵树依靠dfs序建立。然后就是注意空间问题,我想省一下空间,结果31层的树存不下,RE了3遍才找到,把31改成30就A了,,

#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<vector>
#include<iostream>
#define ll int
#define re register
#define inf 0x3f3f3f3f
#define inl inline
#define sqr(x) (x*x)
//#define eps 1e-8
#define debug printf("debug\n");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
using namespace std;
const ll mod=2520;
const ll MAXN=1e5+10;
const ll MAXM=(5e4+10)*4;
inl ll read() {re ll x = 0; re int f = 1;char ch = getchar();while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x * f;
}
inl char readc() {char ch=getchar();while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();return ch;
}
inl void write(re ll x){if(x>=10)write(x/10);putchar(x%10+'0');
}
inl void writeln(re ll x){if(x<0) {x=-x;putchar('-');}write(x); puts("");
}
inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;}
inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;}
inl void FR() {freopen(".in","r",stdin);freopen(".out","w",stdout);
}
inl void FC() {fclose(stdin);fclose(stdout);
}
struct edge {ll u,v,nxt;
}e[MAXN<<1];
ll ssw[MAXN],n,cnt,head[MAXN],root1[MAXN],root2[MAXN];
inl void adde(ll u,ll v) {e[++cnt].u=u;e[cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}
ll T_cnt;
struct Node {ll son[2],cnt;
}Tree[100005<<6];
ll insert(ll pre,ll x) {re ll t=++T_cnt;Tree[t]=Tree[pre];ll now=t;Tree[now].cnt++;for(re ll i=30;~i;i--) {if((x>>i)&1) {Tree[now].son[1]=++T_cnt;now=Tree[now].son[1];pre=Tree[pre].son[1];}else {Tree[now].son[0]=++T_cnt;now=Tree[now].son[0];pre=Tree[pre].son[0];}Tree[now]=Tree[pre];Tree[now].cnt++;}return t;
}
ll topn[MAXN],out[MAXN],d_tot,dfn[MAXN],f[MAXN][30],depth[MAXN];
void dfs(ll x,ll fa) {root1[x]=insert(root1[fa],ssw[x]);f[x][0]=fa;depth[x]=depth[fa]+1;for(re ll i=1;i<=25;i++) f[x][i]=f[f[x][i-1]][i-1];topn[++d_tot]=x;dfn[x]=d_tot;for(re ll h=head[x];h;h=e[h].nxt) {re ll v=e[h].v;if(v==fa) continue ;dfs(v,x);}out[x]=d_tot;
}
ll lca(ll a,ll b) {if(depth[b]<depth[a]) swap(a,b);for(re ll i=25;~i;i--) {if(depth[f[b][i]]<depth[a]) continue ;b=f[b][i];}if(a==b) return a;for(re ll i=25;~i;i--) {if(f[a][i]==f[b][i]) continue ;a=f[a][i],b=f[b][i];}return f[a][0];
}
ll query(ll l,ll r,ll x) {ll ans=0;for(re ll i=30;~i;i--) {ll p=(x>>i)&1;if(Tree[Tree[r].son[p^1]].cnt-Tree[Tree[l].son[p^1]].cnt) {l=Tree[l].son[p^1],r=Tree[r].son[p^1],ans|=(1<<i);}else {l=Tree[l].son[p],r=Tree[r].son[p];}}return ans;
}
int main() {
//  FR();n=read();re ll Q=read();for(re ll i=1;i<=n;i++) ssw[i]=read();for(re ll i=1;i<n;i++) {re ll u=read(),v=read();adde(u,v);adde(v,u);}dfs(1,0);for(re ll i=1;i<=n;i++) {root2[topn[i]]=insert(root2[topn[i-1]],ssw[topn[i]]);}for(re ll i=1;i<=Q;i++) {re ll opt=read();if(opt==1) {re ll x=read(),y=read();writeln(query(root2[topn[dfn[x]-1]],root2[topn[out[x]]],y));}else if(opt==2) {re ll x=read(),y=read(),z=read();ll ssx=lca(x,y),ssy=f[ssx][0];writeln(max(query(root1[ssy],root1[y],z),query(root1[ssy],root1[x],z)));}}
//  FC();return 0;
}

View Code

转载于:https://www.cnblogs.com/20020723YJX/p/9386474.html

[TJOI2018]xor BZOJ5338 可持久trie相关推荐

  1. [TJOI2018]xor

    题目大意: 有一棵树,根节点为1.每个点有点权.有两种操作. 1. 求节点x所在子树中点权与y异或的最大值. 2. 求x到y的路径上点权与z异或的最大值. 解题思路: 可持久化字典树. 对于第一种操作 ...

  2. 【LOJ 10050】The XOR Largest Pair【Trie】

    题目大意: 题目链接:https://loj.ac/problem/10050 求一个数列中的任意两个数字亦或的最大值. 思路: 如果给出一个数字,求一个不比它位数大的数使得这两个数亦或的值最大,那么 ...

  3. loj#10050-The XOR Largest Pair【Trie(字典树)】

    正题 题目链接:https://loj.ac/problem/10050 题目大意 有n个数,求两个数使他们异或起来最大. 解题思路 我们考虑构建一个TrieTrieTrie. 两个分叉为0,1,对于 ...

  4. POJ3764-The xor-longest Path【Trie(字典树)】

    正题 POJ题目链接:http://poj.org/problem?id=3764 其实loj也有题目:https://loj.ac/problem/10056 题目大意 一棵树,求两个点使他们的之间 ...

  5. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  6. 【bzoj4571SCOI2016美味】

    4571: [Scoi2016]美味 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 656  Solved: 350 [Submit][Status ...

  7. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  8. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  9. HDU4825 Xor Sum —— Trie树

    题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

最新文章

  1. 【青少年编程】【四级】用逗号分隔列表
  2. 2019年「自然语言处理NLP」的“高光时刻” --- 28篇标志性论文
  3. 【前端_js】JavaScript知识点总结
  4. 需要熟悉的几个调试命令:objdump/pmap/ldd/stace
  5. oracle帮助系统,开启Oracle的帮助系统
  6. Windows安装mysql8.0
  7. 一大波PyTorch图像分割模型来袭,俄罗斯程序员出品新model zoo
  8. 百面机器学习—10.循环神经网络面试问题总结
  9. 如何高效地学习机器学习算法?
  10. 使用Web界面登陆vSphere
  11. OPPO R9S线刷
  12. 【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)
  13. vgs是什么意思有什么用_Linux中vgs命令起什么作用呢?
  14. java nio oio_java面试题NIO与OIO的区别
  15. 蝴蝶曲线python_蝴组词有哪些?除了蝴蝶还可以组什么?蝴字的基本字义
  16. 绩效考核成绩管理平台
  17. 天池AI学习全面升级,所有学习资源都给你你汇总好啦!
  18. 整数的按权展开 (10 分)
  19. 建立互信及追求卓越的环境
  20. python write函数参数_Python函数-函数参数、返回值

热门文章

  1. 青少年软件编程等级考试 python-中国电子学会、北大等推出青少年软件编程等级标准升级版...
  2. python从入门到入土表情包-Python开发个人专属表情包网站,表情在手,天下我有...
  3. python基本语法语句-第二章 python基本语法元素
  4. python绘制灰度图片直方图-用python简单处理图片(5):图像直方图
  5. python爬虫抓取图片-怎么用爬虫批量抓取网页中的图片?
  6. winpython使用教程-winpython是什么
  7. 案例驱动python编程入门-Python程序设计任务驱动式学习教程
  8. python编程经典案例-精心整理!9个 Python 实用案例分享
  9. python自学入门教程-Python自学入门基础教程-数据类型
  10. python数据分析的主要流程-将Python和R整合进一个数据分析流程