博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4757 可持久化trie树
阅读量:6266 次
发布时间:2019-06-22

本文共 2196 字,大约阅读时间需要 7 分钟。

  首先如果给定一些数,询问这些数中哪个数^给定的数的值最大的话,我们可以建立一颗trie树,根连接的两条边分别为0,1,表示二进制下第15位,那么我们可以建立一颗trie树,每一条从根到叶子节点的链表示一个2^16以内的数,开始每个节点的cnt都是0,那么每插入一个元素,将表示这个值的链上所有位置的cnt++,那么对于一个值要求使得^最大,如果这个值的某一位是1,那么我们最好要找到一个为0的数来和他^,那么判断下0儿子的cnt是不是大于0,然后做就好了。

  那么对于这棵树,我们可以先将1为根,然后对于两个点x,y之间的链拆成x,lca和y,lca的两条链,现在问题就转化为了求一个深度递增的链上所有值和给定值的^值最大,那么我们可以建立可持久化trie,每个节点继承父节点的trie树,我们只需要用x的trie树减去lca father的trie树做开始的问题就好了。

  反思:调试的时候输出调试的,然后答案更新的只按照一部分更新的,忘了改回去了。因为这个题没看题,是别人讲的题意,所以没看到多组数据,在这儿一直错= =。

//By BLADEVIL#include 
#include
#include
#define maxn 200010using namespace std;struct ww { int son[2]; int cnt; ww() { cnt=0; memset(son,0,sizeof son); }}t[maxn<<5];int n,m,l,tot;int a[maxn],pre[maxn<<1],other[maxn<<1],last[maxn],que[maxn],dis[maxn],jump[maxn][20];void connect(int x,int y) { pre[++l]=last[x]; last[x]=l; other[l]=y;}int lca(int x,int y) { if (dis[x]>dis[y]) swap(x,y); int dep=dis[y]-dis[x]; for (int i=0;i<=18;i++) if (dep&(1<
=0;i--) if (jump[x][i]!=jump[y][i]) x=jump[x][i],y=jump[y][i]; return jump[x][0];}void build(int &x,int dep) { if (!x) x=++tot; if (dep<0) return ; build(t[x].son[0],dep-1); build(t[x].son[1],dep-1);} void insert(int &x,int rot,int dep,int key) { if (!x) x=++tot; if (dep==-2) return ; if (key&(1<
dis[que[i]]) jump[other[p]][0]=que[i]; for (int i=1;i<=18;i++) for (int j=1;j<=n;j++){ int cur=que[j]; jump[cur][i]=jump[jump[cur][i-1]][i-1]; } build(jump[1][0],15); for (int i=1;i<=n;i++) insert(que[i],jump[que[i]][0],15,a[que[i]]); //for (int i=1;i<=tot;i++) printf("%d %d %d %d\n",i,t[i].son[0],t[i].son[1],t[i].cnt); //int x,y; scanf("%d%d",&x,&y); printf("%d\n",lca(x,y)); while (m--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); int root=lca(x,y); int ans=0; ans=max(query(x,jump[root][0],z,15),query(y,jump[root][0],z,15)); //ans=query(y,jump[root][0],z,15); printf("%d\n",ans); }}int main() { while (scanf("%d%d",&n,&m)!=EOF) work(); return 0;}

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3669219.html

你可能感兴趣的文章
什么是WeakHashMap--转
查看>>
js 面试题
查看>>
第二十二节,三元运算
查看>>
Yacc 与 Lex 快速入门
查看>>
Unity中HDR外发光的使用
查看>>
Flume负载均衡配置
查看>>
Ajax详解
查看>>
Ubuntu C/C++开发环境的安装和配置
查看>>
百世汇通快递地区选择插件,单独剥离
查看>>
Linux系统调用---同步IO: sync、fsync与fdatasync【转】
查看>>
【MyBatis学习06】输入映射和输出映射
查看>>
[LeetCode] Decode String 解码字符串
查看>>
数字逻辑的一些基本运算和概念
查看>>
ant重新编译打包hadoop-core-1.2.1.jar时遇到的错
查看>>
【★★★★★】提高PHP代码质量的36个技巧
查看>>
3 weekend110的配置hadoop(格式化) + 一些问题解决 + 未免密码配置
查看>>
JavaScript Creating 对象
查看>>
Java compiler level does not match the version of the installed Java project facet.(转)
查看>>
WPF MediaElement.Position属性
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>