1301 邻值查找(set 平衡树 | 链表)
描述
给定一个长度为 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 平衡树 | 链表)的更多相关文章
- CH1301 邻值查找【set应用】
1301 邻值查找 0x10「基本数据结构」例题 描述 给定一个长度为 n 的序列 A,A 中的数各不相同.对于 A 中的每一个数 A_i,求:min(1≤j<i) |A_i-A_j|以及令上 ...
- 【题解】邻值查找 [CH1301]
[题解]邻值查找 [CH1301] 传送门:邻值查找 \([CH1301]\) \([AcWing136]\) [题目描述] 给定一个长度为 \(n\) 的序列 \(A\),\(A\) 中的数各不相同 ...
- 0x13链表与邻接表之邻值查找
题目链接:https://www.acwing.com/problem/content/138/ 参考链接:https://blog.csdn.net/sdz20172133/article/deta ...
- map按value值查找——find_if的使用(转载)
转载:http://www.cnblogs.com/xufeiyang/archive/2012/05/09/2491871.html CValueFind #ifndef _CVALUEFIND_H ...
- 【数据结构】 顺序表查找(折半查找&&差值查找)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 10 首先构造一个 ...
- 查找算法(3)--Interpolation search--插值查找
1. 插值查找 (1)说明 在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢? 打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页 ...
- PHP 根据值查找键名
array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...
- 查找两个链表的第一个交叉结点(Python实现)
题目 给定两个单链表,查找这两个单链表的第一个交叉节点. 例如:链表list_a为:a1→a2→c1→c2→c3,链表list_b为:b1→b2→b3→c1→c2→c3.那么它们第一个交叉结点为c1. ...
- Java枚举-通过值查找对应的枚举
一.背景 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...
随机推荐
- System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容”
.net应用程序通过Oracle.DataAccess.dll访问64位的Oracle服务器,在连接时出现以下异常:“System.TypeInitializationException: The t ...
- 使用Node.js+Hexo+Github搭建个人博客(续)
一.写在前面 在我的上一篇博客<使用Nodejs+Hexo+Github搭建个人博客>中,已经介绍了如何使用 Hexo 在 Github Pages 上搭建一个简单的个人博客.该篇博文将在 ...
- Java 开源博客 Solo 2.5.0 发布
Java 开源博客 Solo 2.5.0 发布 Solo 是一款一个命令就能搭建好的 Java 开源博客系统,如果你想开个独立博客,请一定不要错过! 2.5.0 版本主要支持了 Markdown/JS ...
- spark submit参数及调优
park submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数. 使用格式: ./bin/spark-submit \ ...
- STL的基本操作指令
list :Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. assign() 给list赋值 back() 返回最后一个元素 b ...
- 【python】获取http响应
一个相对完整的http请求,输入ip和端口,输出响应码,响应头,响应体,是否超时,以及出错时的错误信息 处理包括: 1.协议处理,如果是443用https,其他用http 2.HTTPError处理, ...
- 网络编程—tcp
一.TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF ...
- Repair the Wall
问题 : Repair the Wall 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Long time ago , Kitty lived in a small village. ...
- shell 按序删除文件
一.按时间排序 cd /data/wosbak/hrs/pre/ && ls -A -t | awk '{if(NR>15){print $9}}' | xargs rm -rf ...
- bootstrap-table 刷新页面数据
bom.bootstrapTable('load',msg['object']);//这一步 务必要添加. if(msg['code']==1){ bom.find('tbody').css('dis ...