博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
首届湖北省大学程序设计竞赛I题(可持久化trie)
阅读量:5081 次
发布时间:2019-06-12

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

题目大意:给你n个数,m个询问,每个询问为给出L,R,X。

     问[L,R]中的哪个数与X异或值最大,输出这个最大值。

 

可持久化trie的模板题,下面简说一下:

1,根据异或的特征,将数都转换成二进制,自然越是高位与X不同,所得的值越大,所以将数按从高位到低位插入到01trie中,再从01trie中尽量找一个与X二进制串不匹配的就行了。

2,本题是区间询问,不可能每次询问都建一颗01trie,所以采用可持久化结构能够访问历史信息的特点。即对每个前缀建一颗01trie,每个节点记录该节点的数量,就能根据可减性得到任何一个区间的01trie。

3,每个前缀01trie的建立都能在上一个前缀的基础上建立,只需新建插入一个数后改变的那条路径。这样的话建立一个可持久化Trie时间,空间均在O(nlogn)

 

AC代码:

1 #include
2 #define N 200005 3 using namespace std; 4 typedef long long ll; 5 typedef struct NODE{ 6 int sum; //该节点数量 7 int son[2]; 8 NODE(){son[0]=son[1]=0;sum=0;} 9 }node;10 struct Trie{11 node b[N*35]; //b为待开节点 12 int a[N]; //a为根节点点数组 13 int tot;14 Trie() {tot=1;} 15 int ins(int x,ll num) //在x中插入num 16 {17 int tmp,y;18 tmp=y=tot++;19 for(ll i=34;i>=0;i--)20 {21 b[y].son[0]=b[x].son[0];22 b[y].son[1]=b[x].son[1];23 if(num&(1LL<
=0;i--)40 { int x,y;41 int t=(val&(1LL<
>n;63 T.a[0]=0;64 for(int i=1;i<=n;i++)65 {66 int x;67 cin>>x;68 T.a[i]=T.ins(T.a[i-1],x);69 }70 int m;71 cin>>m;72 while(m--)73 {74 ll x,l,r;75 cin>>x>>l>>r;76 ll y=T.query(T.a[l-1],T.a[r],x);77 cout<
<

 

  

转载于:https://www.cnblogs.com/lnu161403214/p/9246363.html

你可能感兴趣的文章
Eclipse 安装SVN插件
查看>>
深度学习
查看>>
TCP粘包问题及解决方案
查看>>
构建之法阅读笔记02
查看>>
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>