怎么代码都这么长。。。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<random>
using namespace std;
const int maxn = 1e5+;
struct node{
int l,r;
int val,key;
int size;
}fhq[maxn];
int cnt,root;
std::mt19937 rnd();
inline int newnode(int val)
{
fhq[++cnt].val=val;
fhq[cnt].key=rnd();
fhq[cnt].size=;
return cnt;
}
inline void update(int now)
{
fhq[now].size=fhq[fhq[now].l].size+fhq[fhq[now].r].size+;
}
///分裂
void split(int now,int val,int &x,int &y)
{
///当前节点不存在
if(!now)x=y=;
else
{
///如果当前节点的值是小于val
///那么这个当前节点的左子树也归到val
///我们把x=now相当于把这个点连接到分裂出来比这个值小的树
///然后我们取递归分裂这个树的右子树
///由于当前节点归到了小于的节点 但是这个接待那的右节点仍然需要重建
if(fhq[now].val<=val)
{
x=now;
///右子树还有往下分裂
split(fhq[now].r,val,fhq[now].r,y);
}else { y=now;
split(fhq[now].l,val,x,fhq[now].l);
}
update(now);
}
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
///如果x的索引是大于y
///当前不满足二叉搜索树的形状,那么我们继续合并x的右子树
if(fhq[x].key>fhq[y].key)
{
fhq[x].r=merge(fhq[x].r,y);
update(x);
return x;
}
else
{
fhq[y].l=merge(x,fhq[y].l);
update(y);
return y;
}
}
int x,y,z;
inline void ins(int val)
{
split(root,val,x,y);
root=merge(merge(x,newnode(val)),y);
}
inline void del(int val)
{
split(root,val,x,z);
split(x,val-,x,y);
y=merge(fhq[y].l,fhq[y].r);
root=merge(merge(x,y),z);
}
inline void getrank(int val)
{
split(root,val-,x,y);
printf("%d\n",fhq[x].size+);
root=merge(x,y);
}
inline void getnum(int rank)
{
int now=root;
while(now)
{
if(fhq[fhq[now].l].size+==rank)
break;
else if(fhq[fhq[now].l].size>=rank)
now=fhq[now].l;
else
{
rank-=fhq[fhq[now].l].size+;
now=fhq[now].r;
}
}
printf("%d\n",fhq[now].val);
}
inline void pre(int val)
{
split(root,val-,x,y);
int now=x;
while(fhq[now].r)
now=fhq[now].r;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
inline void net(int val)
{
split(root,val,x,y);
int now = y;
while(fhq[now].l)
now=fhq[now].l;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
int main(){
int t;
int op;
int val;
cnt=;
scanf("%d",&t);
while(t--){
scanf("%d%d",&op,&val);
if (op==){
ins(val);
}else if (op==){
del(val);
}else if (op==){
getrank(val);
}else if (op==){
getnum(val);
}else if (op==){
pre(val);
}else {
net(val);
}
}
return ;
}

最新文章

  1. Visual Studio Productivity Power Tools居然也开源
  2. ZLL网关程序分析
  3. Leetcode: Nested List Weight Sum II
  4. fiddler 挂载 JS文件
  5. 暑假集训(4)第二弹 -----递推(hdu2254)
  6. Struts2 四、Struts2 处理流程
  7. 几种主流浏览器内置http抓包工具软件使用方法
  8. JDBC连接Oracle数据库代码
  9. Gson解析复杂的Bean类实现Parcelable
  10. 2015 多校联赛 ——HDU5350(huffman)
  11. Swift 结构体的使用
  12. 【UOJ448】【集训队作业2018】人类的本质 min_25筛
  13. 20175316盛茂淞 2018-2019-2 《Java程序设计》第9周学习总结
  14. C 编译过程浅析
  15. 文章如何做伪原创 SEO大神教你几招做&quot;原创&quot;网站文章的心得
  16. c语言struct和c++struct的区别
  17. python使用WSGI接口实现简单网页
  18. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDao' def
  19. OAuth(开放授权)
  20. CS小分队第二阶段冲刺站立会议(5月26日)

热门文章

  1. @at-root和#{&amp;}结合
  2. CentOS 7安装与配置JDK8
  3. CentOS安装手册
  4. 模拟7题解 T1方程的解
  5. css Position 上下左中右布局
  6. MVC开发模式与web经典三层框架
  7. 一个不错的插件(软件).NET开发
  8. Spring Boot:Boot2.0版本整合Neo4j
  9. at: 安排一个任务在未来执行,需要一个atd的系统后台进程
  10. JavaScript--返回顶部方法:锚链接、行内式js写法、外链式、内嵌式