描述

给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 A_i,求:
min(1≤j<i) ⁡|A_i-A_j|
以及令上式取到最小值的 j(记为 P_i)。若最小值点不唯一,则选择使 A_j 较小的那个

输入格式

第一行一个整数n,第二行n个数A_1~A_n。

输出格式

n-1行,每行2个用空格隔开的整数。分别表示当i取2~n时,对应的 min(1≤j<i) ⁡|A_i-A_j| 和 P_i 的值。

样例输入

3
1 5 3

样例输出

4 1
2 1

数据范围与约定

  • 对于30%的数据: n<=100
  • 对于70%的数据: n<=10^4
  • 对于100%的数据: n<=10^5, |A_i|<=10^9

思路:对于一个数,我们需要对出现在它前面的数进行排序,然后找到有序序列中该数应当排在的位置,那么他的前驱和后继就是离他最近的点,比较一下就可以输出。

可以用set(平衡树),自带排序进行排序,或者用链表。O(nlogn)

set:

#include<bits/stdc++.h>
using namespace std; struct Node
{
int x,index;
Node(int x=,int index = ):x(x),index(index){}
bool operator <(const Node &a)const
{
return x < a.x;
}
}; set<Node>s;
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
s.insert(Node(x,));
for(int i=;i<=n;i++)
{
scanf("%d",&x);
set<Node>::iterator r = s.lower_bound(Node(x));
set<Node>::iterator l = r;
l--;
if(r == s.end())
{
printf("%d %d\n",x-l->x,l->index);
}
else if(r == s.begin())
{
printf("%d %d\n",r->x - x,r->index);
}
else if(x-l->x <= r->x - x)
{
printf("%d %d\n",x-l->x,l->index);
}
else
printf("%d %d\n",r->x-x,r->index);
s.insert(Node(x,i));
}
}

链表:

先读入数据,然后排序,记录下原数据位置i的数据在排序后处于何处(用p【i】表示),那么在排序数组中pre和next就是离该数最近的数

,从怕p【n】到p【2】处理(因为这样该数永远是剩下的数在原数组中下标最大的),处理完后将该数删除。O(nlogn)

#include<bits/stdc++.h>
using namespace std; struct Node
{
int val;
int next;
int pre;
int index;
}node[]; int p[];
int n; bool cmp(Node a,Node b)
{
return a.val < b.val;
} int ans1[];
int ans2[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&node[i].val);
node[i].index = i;
}
sort(node+,node++n,cmp);
for(int i=;i<=n;i++)
{
node[i].next = i+;
node[i].pre = i-;
}
node[].pre = node[n].next = -;
for(int i=;i<=n;i++)
{
p[node[i].index] = i;
}
for(int i=n;i>=;i--)
{
if(node[p[i]].next == -)ans1[i] = node[p[i]].val - node[node[p[i]].pre].val,ans2[i] = node[node[p[i]].pre].index;
else if(node[p[i]].pre == -)ans1[i] = node[node[p[i]].next].val-node[p[i]].val,ans2[i] = node[node[p[i]].next].index;
else if(node[p[i]].val - node[node[p[i]].pre].val <= node[node[p[i]].next].val-node[p[i]].val)ans1[i] = node[p[i]].val - node[node[p[i]].pre].val,ans2[i] = node[node[p[i]].pre].index;
else ans1[i] = node[node[p[i]].next].val-node[p[i]].val,ans2[i] = node[node[p[i]].next].index;
if(node[p[i]].pre != -)
{
node[node[p[i]].pre].next = node[p[i]].next;
}
if(node[p[i]].next != -)
{
node[node[p[i]].next].pre = node[p[i]].pre;
}
}
for(int i=;i<=n;i++)
{
printf("%d %d\n",ans1[i],ans2[i]);
}
}

1301 邻值查找(set 平衡树 | 链表)的更多相关文章

  1. CH1301 邻值查找【set应用】

    1301 邻值查找 0x10「基本数据结构」例题 描述 给定一个长度为 n 的序列 A,A 中的数各不相同.对于 A 中的每一个数 A_i,求:min(1≤j<i) ⁡|A_i-A_j|以及令上 ...

  2. 【题解】邻值查找 [CH1301]

    [题解]邻值查找 [CH1301] 传送门:邻值查找 \([CH1301]\) \([AcWing136]\) [题目描述] 给定一个长度为 \(n\) 的序列 \(A\),\(A\) 中的数各不相同 ...

  3. 0x13链表与邻接表之邻值查找

    题目链接:https://www.acwing.com/problem/content/138/ 参考链接:https://blog.csdn.net/sdz20172133/article/deta ...

  4. map按value值查找——find_if的使用(转载)

    转载:http://www.cnblogs.com/xufeiyang/archive/2012/05/09/2491871.html CValueFind #ifndef _CVALUEFIND_H ...

  5. 【数据结构】 顺序表查找(折半查找&&差值查找)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 10 首先构造一个 ...

  6. 查找算法(3)--Interpolation search--插值查找

    1. 插值查找 (1)说明 在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢? 打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页 ...

  7. PHP 根据值查找键名

    array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...

  8. 查找两个链表的第一个交叉结点(Python实现)

    题目 给定两个单链表,查找这两个单链表的第一个交叉节点. 例如:链表list_a为:a1→a2→c1→c2→c3,链表list_b为:b1→b2→b3→c1→c2→c3.那么它们第一个交叉结点为c1. ...

  9. Java枚举-通过值查找对应的枚举

    一.背景 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...

随机推荐

  1. PID控制器开发笔记之五:变积分PID控制器的实现

    在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的.然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强.积分系数取大 ...

  2. 如何获取STM32 MCU的唯一ID

    前段时间由于应用需要对产品授权进行限制,所以研究了一下有关STM32 MCU的唯一ID的资料,并最终利用它实现了我们的目标. 1.基本描述 在STM32的全系列MCU中均有一个96位的唯一设备标识符. ...

  3. Oracle从入门到精通(详细) 明日科技

  4. python接口自动化测试三十三:获取时间戳(10位和13位)

    很多时候,在调用接口时,需要对请求进行签名.需要用到unix时间戳. 在python里,在网上介绍的很多方法,得到的时间戳是10位.而java里默认是13位(milliseconds,毫秒级的). 下 ...

  5. Duplicate 复制数据库 搭建Dataguard

    1 操作系统环境 此处隐藏具体信息 System IP-address db_name db_version Comment         Target DB         Auxiliary D ...

  6. python面向对象三大特性之封装

    一. 概述 定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性 二.封装手段 使用双下划线将属性和方法隐藏起来 cla ...

  7. python函数之各种器

    一: 装饰器 1:装饰器模板 def wrapper(func): def inner(*args,**kwargs): ret =func(*args,**kwargs) return ret re ...

  8. python编程实现十进制的转换(十进制到任何进制不用系统函数实现)

    # 用户给定一个十进制数据,以及进制n, 完成n进制的转换,输出结果给用户(不要借助已有函数) # 用户的输入进制数据Decdata = int(input("请输入一个十进制数据:&quo ...

  9. 18/03/18 04:53:44 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

    1:遇到这个问题是在启动bin/spark-shell以后,然后呢,执行spark实现wordcount的例子的时候出现错误了,如: scala> sc.textFile()).reduceBy ...

  10. MySQL Windows 下的安装

    my.ini ####################配置文件开始################### # For advice on how to change settings please s ...