3224: Tyvj 1728 普通平衡树

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 14480  Solved: 6275

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

HINT

 

1.n的数据范围:n<=100000

2.每个数的数据范围:[-2e9,2e9]

code

  1 #include<cstdio>
  2 using namespace std;
  3  
  4 const int MAXN = 100010;
  5  
  6 int fa[MAXN],ch[MAXN][2],siz[MAXN],cnt[MAXN],data[MAXN];
  7 /*fa表示父亲,ch表示左儿子和右儿子,siz表示当前节点的大小,cnt表示重复数字多少,data表示存储的数字*/
  8 int tot,root,n;
  9  
 10 int son(int x)
 11 {
 12     return x==ch[fa[x]][1];
 13 }
 14 void pushup(int rt)
 15 {
 16     int l = ch[rt][0], r = ch[rt][1];
 17     siz[rt] = siz[l]+siz[r]+cnt[rt];
 18 }
 19 void rotate(int x)//翻转操作 
 20 {
 21     int y = fa[x],z = fa[y],b = son(x),c = son(y),a = ch[x][!b];
 22     if (z) ch[z][c] = x; else root = x;fa[x] = z;
 23     if (a) fa[a] = y; ch[y][b] = a;
 24     ch[x][!b] = y;fa[y] = x;
 25     pushup(y);
 26     pushup(x);
 27 }
 28 void splay(int x,int rt)
 29 {
 30     while (fa[x]!=rt)
 31     {
 32         int y = fa[x],z = fa[y];
 33         if (z==rt) rotate(x);
 34         else
 35         {
 36             if (son(x)==son(y))
 37             {
 38                 rotate(y);rotate(x);
 39             }
 40             else
 41             {
 42                 rotate(x);rotate(x);
 43             }
 44         }
 45     }
 46 }
 47 void ins(int &rt,int x)//插入操作 
 48 {
 49     if (rt==0)
 50     {
 51         rt = ++tot;
 52         data[tot] = x;
 53         siz[tot] = cnt[tot] = 1;
 54         return ;
 55     }
 56     if (x==data[rt])
 57     {
 58         cnt[rt] ++;
 59         siz[rt] ++;
 60         return ;
 61     }
 62     if (x<data[rt])
 63     {
 64         ins(ch[rt][0],x);
 65         fa[ch[rt][0]] = rt;
 66         pushup(rt);
 67     }
 68     else
 69     {
 70         ins(ch[rt][1],x);
 71         fa[ch[rt][1]] = rt;
 72         pushup(rt);
 73     }
 74 }
 75 int getmn(int rt)
 76 {
 77     int p = rt,ans = -1;
 78     while (p)
 79     {
 80         ans = p;
 81         p = ch[p][0];
 82     }
 83     return ans;
 84 }
 85 void del(int rt,int x)//删除操作 
 86 {
 87     if (data[rt]==x)
 88     {
 89         if (cnt[rt]>1)
 90         {
 91             cnt[rt]--;siz[rt]--;
 92         }
 93         else
 94         {
 95             splay(rt,0);
 96             int p = getmn(ch[rt][1]);
 97             if (p!=-1)
 98             {
 99                 splay(p,rt);
100                 root = p;fa[p] = 0;
101                 ch[p][0] = ch[rt][0];fa[ch[rt][0]] = p;
102                 pushup(p);
103             }
104             else
105             {
106                 root = ch[rt][0];
107                 fa[ch[rt][0]] = 0;
108             }
109         }
110         return ;
111     }
112     if (x<data[rt])
113     {
114         del(ch[rt][0],x);
115         pushup(rt);
116     }
117     else
118     {
119         del(ch[rt][1],x);
120         pushup(rt);
121     }
122 }
123 int getpre(int rt,int x)//找前驱 
124 {
125     int p = rt,ans;
126     while (p)
127     {
128         if (x<=data[p]) p = ch[p][0];
129         else ans = p, p = ch[p][1];
130     }
131     return ans;
132 }
133 int getsuc(int rt,int x)//找后继 
134 {
135     int p = rt,ans;
136     while (p)
137     {
138         if (x>=data[p]) p = ch[p][1];
139         else ans = p, p = ch[p][0];
140     }
141     return ans;
142 }
143 int getk(int rt,int k)//找k的排序 
144 {
145     if (data[rt]==k)
146     {
147         splay(rt,0);
148         if (ch[rt][0]==0) return 1;
149         else return siz[ch[rt][0]]+1;
150     }
151     if (k<data[rt]) return getk(ch[rt][0],k);
152     else return getk(ch[rt][1],k);  
153 }
154 int getkth(int rt,int k)//找第k个数 
155 {
156     int l = ch[rt][0];
157     if (siz[l]+1<=k&&k<=siz[l]+cnt[rt]) return data[rt];
158     if (k<siz[l]+1) return getkth(ch[rt][0],k);
159     if (siz[l]+cnt[rt]<k) return getkth(ch[rt][1],k-(siz[l]+cnt[rt]));
160 }
161 int main()
162 {
163     scanf("%d",&n);
164     while (n--)
165     {
166         int opt,x;
167         scanf("%d%d",&opt,&x);
168         if (opt==1) ins(root,x);
169         if (opt==2) del(root,x);
170         if (opt==3)
171             printf("%d\n",getk(root,x));
172         if (opt==4)
173             printf("%d\n",getkth(root,x));
174         if (opt==5)
175             printf("%d\n",data[getpre(root,x)]);
176         if (opt==6)
177             printf("%d\n",data[getsuc(root,x)]);
178     }   
179     return 0;
180 }

 

转载于:https://www.cnblogs.com/mjtcn/p/7252051.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux编译c++ 静态库,C/C++ 条件编译静态库

》windows 下方法&#xff1a;1.方法一&#xff1a;VS工程中中直接添加1.1在VS的属性-》常规-》附加库目录&#xff0c;添上文件夹的路径:例如&#xff1a;lib/x64&#xff1b;1.2输入的附加依赖项&#xff0c;添加上库的名字&#xff0c;例如&#xff1a;dmapi.lib1.3 对用到该…

[BZOJ 2654]tree(陈立杰)

Description 给你一个无向带权连通图&#xff0c;每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。题目保证有解。Input 第一行V,E,need分别表示点数&#xff0c;边数和需要的白色边数。接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号)&#xff0c;…

DM3软件如何在linux中安装,DM3 文件扩展名: 它是什么以及如何打开它?

DM3 疑难解答频繁的 DM3 打开问题ImageJ 不存在你尝试加载 DM3 文件并收到错误&#xff0c;例如 “%%os%% 无法打开 DM3 文件扩展名”。 通常&#xff0c;%%os%% 中会出现这种情况&#xff0c;因为 ImageJ 未安装在你的电脑上。 你将无法双击以打开 DM3&#xff0c;因为你的操作…

CentOS6.8下安装memcached并设置开机自启动

参考资料&#xff1a;http://www.cnblogs.com/handongyu/p/6419305.html http://coolnull.com/1986.html 一、安装libevent 首先检查系统中是否安装了libevent [rootyeebian ~]# rpm -qa | grep libevent 如果安装了则查看libevent的安装路径&#xff0c;后续安装时需要用到 […

ftp 530 linux,Linux启动ftp服务器530 Permission denied解决方法

重新在虚拟机下安装了linux。现在我想启动linux自带的ftp服务器&#xff1a;#service vsftpd start 。如果想linux启动是自动启动ftp服务器&#xff1a;#chkconfig vsftpd on 。运行putty&#xff0c;以root身份进入&#xff0c;出现了报错 530 Permission denied &…

Shiro身份认证授权原理

shiro在应用程序中的使用是用Subject为入口的&#xff0c; 最终subject委托给真正的管理者ShiroSecurityMannager Realm是Shiro获得身份认证信息和来源信息的地方(所以这里是我们实现的)我们只要继承他的实现类重写方法就好了&#xff0c;AuthorizingRealm 身份认证过程 自定义…

linux进程路由策略,linux路由表,策略路由,路由查找

路由表内核中路由表有2种&#xff1a;l 一个是缓存路由(fib)&#xff0c;是自动学习生成自动管理的&#xff0c;用户没必要去干预&#xff0c;但是内核还是提供了方法让用户可以去清空它。但是用户不能设置它的项&#xff0c;但是可以根据这个缓存更新的原理从外部影响他。l 路…

图形桌面linux触摸,新手看招:用图形桌面访问Linux操作系统

创建用户帐户&#xff1a;adduser login-name (OS:Red Hat)useradd login-name (OS:SuSe)为帐户添加密码&#xff1a;passwd login-name (密码应该包括一个数字&#xff0c;且不能为英文单词)结束登录程序&#xff0c;启动另一登录实例&#xff1a;CtrlD从终端启动图形窗口环境…

Python namedtuple(命名元组)使用实例

Python namedtuple(命名元组)使用实例 #!/usr/bin/python3import collectionsMyTupleClass collections.namedtuple(MyTupleClass,[name, age, job]) obj MyTupleClass("Tomsom",12,Cooker) print(obj.name) print(obj.age) print(obj.job)执行结果&#xff1a; To…

pd怎么卸载linux系统,parallels desktop11怎么卸载?parallels desktop11卸载方法

parallels desktop11是一款功能强大的MAC虚拟机软件&#xff0c;用户通过该软件可在mac系统下运行安装windows或Linux操作系统&#xff0c;不过很多时候用户在安装后&#xff0c;由于后期没有使用虚拟机的需求&#xff0c;故此想要将其删除&#xff0c;但是又不知道如何操作&am…

html5中使页面中元素居中

在div中加入 style"text-align: center;

linux下jdk源码安装,Linux JDK 源码安装

一 环境1.1 操作系统[roothost-xxxsoft]# lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarchDistributor ID: CentOSDescription: CentOS re…

Python map/reduce

2017-07-31 18:20:59 一、map函数 map()&#xff1a;会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数&#xff0c;返回包含每次 function 函数返回值的iterator,即迭代器&#xff0c;使用list函数可以将之转成列表。 map(f…

linux裸机安装nginx,linux环境下安装nginx步骤 - 进击的乌龟 - 博客园

开始前&#xff0c;请确认gcc g开发类库是否装好&#xff0c;默认已经安装。ububtu平台编译环境可以使用以下指令apt- get install build- essentialapt - get install libtoolcentos平台编译环境使用如下指令安装make&#xff1a;yum -y install gcc automake autoconf libtoo…

Effective C++ 条款21

必须返回对象时。别妄想返回其reference 我们上节分析了对象引用传递的优点&#xff0c;如今说明函数返回引用对象带来的种种坏处。 先来一段代码&#xff1a; class Rational{ public:Rational(int numerator0, int denominator1);…… private:int n, d;friendconst Rationa…

html 中 em

◆px像素&#xff08;Pixel&#xff09;&#xff0c;相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 ◆em是相对长度单位&#xff0c;相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置&#xff0c;则相对于浏览器的默认字体尺寸。 因此用px来定…

c语言命名参数,按照C语言的规定,实参和形参的命名不得重复。

按照羊脂玉具有( )光泽。衡量睡眠质量好坏包括入睡快慢,睡眠深浅,睡后能否解乏(精神情况、规定是否影响日常的工作和生活)三个方面。参和“有药吃而无伙食命亦难保”提示健康普及必须遵循的经济性原则。形参治病与调补都需要辩证,其中区别在于用药与药量的不同。命得重咳嗽除了…