一道平衡树的题目_第1页
一道平衡树的题目_第2页
一道平衡树的题目_第3页
一道平衡树的题目_第4页
一道平衡树的题目_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、道平衡树的题目题目描述要你维护一个集合,集合里面的元素为二元组(x,y)。这个集合中一开始有n个元素。支持如下操作:Insert,x0,y0,插入一个元素(xO,yO)。Delete,xO,删除所有x值为xO的元素。Querymin1,查询所有元素中x值最小的元素。Querymin2,查询所有元素中y值最小的元素。Query1,xO,查询集合中是否有x值为xO的元素。Query2,xO,查询集合中x值大于等于xO的第一个元素(不存在的话输出-1)。Query3,x0,查询x值小于等于xO的所有元素中y值的最小值(不存在的话输出-1)。Query4,k,查询集合中x值第k大的元素。Query5,

2、k,查询x值从小到大前k个元素的y值的最大值。1O.Query6,k,查询x值从小到大前k个元素的y值的和。保证输入的X中没有重复。数据范围:n=1e5,操作个数Q=1e5。输入格式第一行输入两个数n,Q,后面n行每行输入两个整数x,y。后面Q行每行进行一个操作。输出格式输出操作3-1O中的查询结果。这道题教会了我如果用平衡树来维护一些简单的辅助信息,极值、区间和等等(这道题我调了几乎一整天)。代码如下#include#include#include#include#include#include#include#include#include#include#include#include#

3、defineLLlonglong#definePIIpair#defineLtru.l#defineRtru.rusingnamespacestd;constintN=2e5+5,INF=1e9;structNodeintl,r;intx,y,val;为key,y为辅助信息intsize,max,min=1e9;maxnin记录y的最大值、最小值LLsum;记录以该节点为根的子树中的和trN;ntroot,idx;voidpushup(intu)由左右儿子节点推出父亲节点的信息tru.size=trL.size+trR.size+1;tru.sum=trL.sum+trR.sum+tru.y;

4、tru.max=max(tru.y,max(trL.max,trR.max);tru.min=min(tru.y,min(trL.min,trR.min);intgetNode(intkey,inty)创建新节点tr+idx.x=key;tridx.y=y;tridx.max=tridx.min=tridx.sum=y;tridx.size=1;tridx.val=rand();returnidx;voidzig(int&u)右旋intq=L;L=trq.r,trq.r=u;u=q;pushup(R);pushup(u);voidzag(int&u)左旋intq=R;R=trq.l,trq.l

5、=u;u=q;pushup(L);pushup(u);voidinsert(int&u,intkey,inty)插入一个节点(操作)if(!u)u=getNode(key,y);elseif(keytru.val)zig(u);elseinsert(R,key,y);if(trR.valtru.val)zag(u);pushup(u);voidremove(int&u,intkey)删除一个节点(操作)if(!u)return;if(tru.x=key)if(L|R)if(!R|trL.va卜trR.val)zig(u);remove(R,key);elsezag(u);remove(L,ke

6、y);elseu=0;elseif(keykey)returnget(L,key);returnget(R,key);intfind(int&u,intrank)找出树中排名为ank的节点(操作和操作)if(!u)return-1;if(trL.size=rank)returnfind(L,rank);if(trL.size+1=rank)returntru.x;returnfind(R,rank-trL.size-1);intgetPrev(intu,intkey)找出平衡树中小于等于ey的最大值(操作7if(!u)return-1;if(keytru.x)returngetNext(R,k

7、ey);returnmin(tru.x,getNext(L,key);intfindMax(int&u,intrank)找出树中x排名为1-rank的y的最大值(操作)if(!u)return-INF;if(trL.size=rank)returnfindMax(L,rank);if(trL.size+1=rank)returnmax(trL.max,tru.y);returnmax(trL.max,max(tru.y,findMax(R,rank-1-trL.size);intgetMin(int&u,intkey)找出树中x小于等于key的所有数的最小值(操作)if(!u)returnIN

8、F;if(key=rank)returnfindSum(L,rank);if(trL.size+1=rank)returntrL.sum+tru.y;returntrL.sum+tru.y+findSum(R,rank-1-trL.size);intmain()intn,m;scanf(%d%d,&n,&m);for(inti=1;i=INF)t=-1;printf(%dn,t);elseif(op=7)小于等于x的数中y的最小值scanf(%d,&x);intkey=getPrev(root,x);printf(%dn,getMin(root,key);elseif(op=8)的第k大元素scanf(%d,&x);printf(%dn,find(root,n-x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论