




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西警官职业学院《当代资本主义研究》2023-2024学年第二学期期末试卷
- 深度解析《GBT 43872-2024水泥氯离子固化率检测方法》
- 青岛幼儿师范高等专科学校《秦汉史专题》2023-2024学年第二学期期末试卷
- 创业中国地图制作详解
- 机上突发疾病乘客救助流程
- 户外传媒行业分析模板
- sbs防水卷材合同范例
- 生物教学反思(8篇)
- 妇幼保健工作总结【7篇】
- 公司垃圾收购合同标准文本
- 江苏省扬州市2022-2023学年八年级下学期物理期中试卷(含答案)1
- 部队涉枪涉弹安全教育课件
- 电商仓库发货与打包关键细节培训课件
- 重大责任事故罪的认定课件
- A4纸笔记本横格线条打印模板
- 人教版小学数学五年级下册《同分母分数加减法》课件
- 260吨汽车吊地基承载力验算
- 2023超星尔雅《创新创业》答案
- 110kV变电站短路电流计算书
- 后腹腔镜下输尿管切开取石术课件
- 与装修人员签安全协议书
评论
0/150
提交评论