两种操作,1是加入数字,二是找最接近的

用set或者平衡二叉树就好了

只写了二叉树的,套版子就好

#include<bits/stdc++.h>
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define scfff(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pf printf
#define prf(x) printf("%d\n",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int inf=0xfffffff;
const int N=1e5+7;
struct node
{
int lc,rc,h,v;
}tree[N];
int pos=0,x1,x2,x3,root;
int right_rotate(int r)//zig右旋
{
int t = tree[r].lc;
tree[r].lc = tree[t].rc;
tree[t].rc = r;
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;
tree[t].h = max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1;
return t;
}
int left_rotate(int r)//zag左旋
{
int t = tree[r].rc;
tree[r].rc = tree[t].lc;
tree[t].lc = r;
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;
tree[t].h = max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1;
return t;
}
int right_left_rotate(int r)//zigzag双旋
{
tree[r].rc = right_rotate(tree[r].rc);
return left_rotate(r);
}
int left_right_rotate(int r)//zagzig双旋
{
tree[r].lc = left_rotate(tree[r].lc);
return right_rotate(r);
}
void maintain(int &r)
{
if(tree[tree[r].lc].h == tree[tree[r].rc].h+2)//左子树高了
{
int t = tree[r].lc;
if(tree[tree[t].lc].h == tree[tree[r].rc].h+1) r = right_rotate(r);//左子树的左儿子,对应第一种情况
else if(tree[tree[t].rc].h == tree[tree[r].rc].h+1) r = left_right_rotate(r);
}
else if(tree[tree[r].rc].h == tree[tree[r].lc].h+2)//右子树高了
{
int t = tree[r].rc;
if(tree[tree[t].rc].h == tree[tree[r].lc].h+1) r = left_rotate(r);//右子树的右儿子,对应第四种情况
else if(tree[tree[t].lc].h == tree[tree[r].lc].h+1) r = right_left_rotate(r);
}
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;//高度更新
}
void prem(int x,int r)//找x的前驱
{
if(r == 0) return;
if(tree[r].v < x)
{
x1 = tree[r].v;
prem(x,tree[r].rc);
}
else prem(x,tree[r].lc);
}
void nexm(int x,int r)//找x后一个数字
{
if(r == 0) return;
if(tree[r].v > x)
{
x2 = tree[r].v;
nexm(x,tree[r].lc);
}
else nexm(x,tree[r].rc);
}
void find(int x,int r)//找到x
{
if(r==0) return;
if(tree[r].v ==x)
{
x3=x;
return ;
}
if(tree[r].v > x)
find(x,tree[r].lc);
else
find(x,tree[r].rc);
}
int insert(int r,int x)
{
if(r == 0)//找到一个空的节点,赋值
{
tree[++pos].h = 1;//高度初始化
tree[pos].v = x;
return pos;
}
if(x < tree[r].v) tree[r].lc = insert(tree[r].lc,x);//插入的数小于根节点,因此在它的左子树插入
else if(x > tree[r].v) tree[r].rc = insert(tree[r].rc,x);
maintain(r);//维持节点r的平衡
return r;//返回新的根节点
}
int main()
{
int n,aa,x;scf(n);
while(n--)
{
scff(aa,x);
if(aa==1)
root=insert(root,x);
else
{
x1=x2=x3=0;
prem(x,root);
nexm(x,root);
find(x,root);
// cout<<x1<<" "<<x2<<endl;
if(x3)
prf(x3);
else if(x1==0&&x2==0)
pf("Empty!\n");
else if(x1==0)
prf(x2);
else if(x2==0)
prf(x1);
else
{
if(x-x1==x2-x)
pf("%d %d\n",x1,x2);
else
{
if(x-x1<x2-x)
prf(x1);
else
prf(x2);
}
}
}
}
return 0;
}

10.1jihe的更多相关文章

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  2. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  3. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  4. CI Weekly #10 | 2017 DevOps 趋势预测

    2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...

  5. 10个最好用的HTML/CSS 工具、插件和资料库

    大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...

  6. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  7. 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误

    1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8   在安装的时候报错: -1ubu1604-amd64.deb 提示: ...

  8. Ubuntu 16.10 安装byzanz截取动态效果图工具

    1.了解byzanz截取动态效果图工具 byzanz能制作文件小,清晰的GIF动态效果图,不足就是,目前只能通过输入命令方式来录制. byzanz主要的参数选项有: -d, --duration=SE ...

  9. Ubuntu 16.10 安装KolourPaint 4画图工具

    KolourPaint 4画图工具简单实用,可以绘画.视频处理和图标编辑: • 绘画:绘制图表和“手绘” • 视频处理:编辑截图和照片;应用特效 • 图标编辑:绘画剪贴和标识透明化 1.在Ubuntu ...

随机推荐

  1. JAVA第一周学习

    新学期伊始,六门专业课,课课重要,无法抉择重心,但日子还是要过的,而且要精细的过,不能得过且过 JAVA第一周任务 一:学习第一章视频 二:使用JDB调试JAVA 三:输入调试教材上代码,并把代码上传 ...

  2. [物理学与PDEs]第1章习题2 均匀带电球面的电场强度与电势

    设有一均匀分布着电荷的半径为 $R$ 的球面, 其电荷密度 (即单位面积上的电荷量) 为 $\sigma$. 试求该球面所形成电场的电场强度及电势. 解答: 设 $P$ 距圆心的距离为 $r$, 不妨 ...

  3. 013_RomanToInteger

    #####solution1####faster#### def romanToInt(s): d={ 'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, ...

  4. CentOS/Linux开放某些端口

    CentOS/Linux开放某些端口 CentOS/Linux 装载系统的时候只开启了少数端口如22,80(有些连80都没有开放)等. 结果再装完Nginx+PHP+MySQL 后不能访问网站. 当然 ...

  5. Linux负载查询定位工具

    1 uptime命令,负载查询命令 02:34:03 // 当前时间up 2 days, 20:14 // 系统运行时间1 user // 正在登录用户数 而最后三个数字呢,依次则是过去 1 分钟.5 ...

  6. js中精度问题以及解决方案

    js中的数字按照IEEE 754的标准,使用64位双精度浮点型来表示.其中符号位S,指数位E,尾数位M分别占了1,11,52位,并且在ES5规范中指出了指数位E的取值范围是[-1074, 971]. ...

  7. 关于MySQL中的8个 character_set 变量

    https://blog.csdn.net/sun8112133/article/details/79921734 本篇会简单介绍在 MySQL 中关于 8个 character_set 变量的基本作 ...

  8. 简单对比git pull和git pull --rebase的使用

    使用下面的关系区别这两个操作:git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 现在来看看git m ...

  9. nginx php-fpm开启session

    一.  权限问题,这个是发生在多数情况下 找到php session目录设置给 nginx 或者 apache最大权限 二.  配置问题按如下就没啥问题了 [Session] session.save ...

  10. 【easy】349. Intersection of Two Arrays

    找两个数组的交集(不要多想,考虑啥序列之类的,就是简单的两堆数求交集啊!!!最后去个重就好了) //LeetCode里用到很多现成函数的时候,苦手だな- //这个题的思路是,先sort,把两个vect ...