[TJOI2018]xor BZOJ5338 可持久trie
遇到水题了。贼嗨森。
题目传送门
题意简单,就不多解释了。
可持久化trie树模板*2,就A了。
第一棵树表示从根到该点,第二棵树依靠dfs序建立。然后就是注意空间问题,我想省一下空间,结果31层的树存不下,RE了3遍才找到,把31改成30就A了,,
![](/assets/blank.gif)
![](/assets/blank.gif)
#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相关推荐
- [TJOI2018]xor
题目大意: 有一棵树,根节点为1.每个点有点权.有两种操作. 1. 求节点x所在子树中点权与y异或的最大值. 2. 求x到y的路径上点权与z异或的最大值. 解题思路: 可持久化字典树. 对于第一种操作 ...
- 【LOJ 10050】The XOR Largest Pair【Trie】
题目大意: 题目链接:https://loj.ac/problem/10050 求一个数列中的任意两个数字亦或的最大值. 思路: 如果给出一个数字,求一个不比它位数大的数使得这两个数亦或的值最大,那么 ...
- loj#10050-The XOR Largest Pair【Trie(字典树)】
正题 题目链接:https://loj.ac/problem/10050 题目大意 有n个数,求两个数使他们异或起来最大. 解题思路 我们考虑构建一个TrieTrieTrie. 两个分叉为0,1,对于 ...
- POJ3764-The xor-longest Path【Trie(字典树)】
正题 POJ题目链接:http://poj.org/problem?id=3764 其实loj也有题目:https://loj.ac/problem/10056 题目大意 一棵树,求两个点使他们的之间 ...
- 提高篇 第二部分 字符串算法 第3章 Trie字典树
Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...
- 【bzoj4571SCOI2016美味】
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 656 Solved: 350 [Submit][Status ...
- 有趣题目和认知合集(持续更新)
写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...
- 可持久化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 ...
- HDU4825 Xor Sum —— Trie树
题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
最新文章
- 【青少年编程】【四级】用逗号分隔列表
- 2019年「自然语言处理NLP」的“高光时刻” --- 28篇标志性论文
- 【前端_js】JavaScript知识点总结
- 需要熟悉的几个调试命令:objdump/pmap/ldd/stace
- oracle帮助系统,开启Oracle的帮助系统
- Windows安装mysql8.0
- 一大波PyTorch图像分割模型来袭,俄罗斯程序员出品新model zoo
- 百面机器学习—10.循环神经网络面试问题总结
- 如何高效地学习机器学习算法?
- 使用Web界面登陆vSphere
- OPPO R9S线刷
- 【Java类的封装性】封装的日期类。Person类,使用对象作为成员变量并实现深拷贝。(利用了类的封装性)
- vgs是什么意思有什么用_Linux中vgs命令起什么作用呢?
- java nio oio_java面试题NIO与OIO的区别
- 蝴蝶曲线python_蝴组词有哪些?除了蝴蝶还可以组什么?蝴字的基本字义
- 绩效考核成绩管理平台
- 天池AI学习全面升级,所有学习资源都给你你汇总好啦!
- 整数的按权展开 (10 分)
- 建立互信及追求卓越的环境
- python write函数参数_Python函数-函数参数、返回值
热门文章
- 青少年软件编程等级考试 python-中国电子学会、北大等推出青少年软件编程等级标准升级版...
- python从入门到入土表情包-Python开发个人专属表情包网站,表情在手,天下我有...
- python基本语法语句-第二章 python基本语法元素
- python绘制灰度图片直方图-用python简单处理图片(5):图像直方图
- python爬虫抓取图片-怎么用爬虫批量抓取网页中的图片?
- winpython使用教程-winpython是什么
- 案例驱动python编程入门-Python程序设计任务驱动式学习教程
- python编程经典案例-精心整理!9个 Python 实用案例分享
- python自学入门教程-Python自学入门基础教程-数据类型
- python数据分析的主要流程-将Python和R整合进一个数据分析流程