博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「模板」 01 Trie实现平衡树功能
阅读量:5259 次
发布时间:2019-06-14

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

不想多说什么了。费空间,也不算太快,唯一的好处就是好写吧。

#include 
#include
const int MAXN=100010<<5,INF=10000000;int n;class Trie{ public: Trie(void) { cnt=1; memset(s,0,sizeof s); } void Insert(int x) { int k=1,p=x+INF; for(int i=30,t;~i;++s[k=s[k].c[t]].size,--i) if(!s[k].c[t=p>>i&1]) s[k].c[t]=++cnt; s[k].v=x; } void Erase(int x) { int k=1,p=x+INF; for(int i=30;~i;--s[k=s[k].c[p>>i&1]].size,--i); } int Rank(int x) { int k=1,p=x+INF,ans=1; for(int i=30,t;~i;--i,k=s[k].c[t]) if(t=p>>i&1) ans+=s[s[k].c[0]].size; return ans; } int Find(int x) { int k=1,ans=0; for(int i=30,t,f;~i;--i,k=s[k].c[t]) if(t=(x>(f=s[s[k].c[0]].size))) x-=f; return s[k].v; } int Pre(int x) { return Find(Rank(x)-1); } int Next(int x) { return Find(Rank(x+1)); } private: int cnt; struct node { int v,size,c[2]; }s[MAXN];}T;int main(int argc,char *argv[]){ freopen("testdata.in","r",stdin); freopen("my.out","w",stdout); scanf("%d",&n); for(int i=1,opt,x;i<=n;++i) { scanf("%d %d",&opt,&x); switch(opt) { case 1: T.Insert(x); break; case 2: T.Erase(x); break; case 3: printf("%d\n",T.Rank(x)); break; case 4: printf("%d\n",T.Find(x)); break; case 5: printf("%d\n",T.Pre(x)); break; case 6: printf("%d\n",T.Next(x)); break; } } fclose(stdin); fclose(stdout); return 0;}

谢谢阅读。

转载于:https://www.cnblogs.com/Capella/p/8361688.html

你可能感兴趣的文章
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
Windows 2003全面优化
查看>>
URAL 1002 Phone Numbers(KMP+最短路orDP)
查看>>
web_day4_css_宽度
查看>>
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
我的Hook学习笔记
查看>>
js中的try/catch
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
整理推荐的CSS属性书写顺序
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
源代码的下载和编译读后感
查看>>