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 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...
随机推荐
- 计算机信息类ComputerInfo(车)
using System; using System.Management; using System.Net; using System.Net.Sockets; using System.Text ...
- list_test
#! -*- coding:utf-8 -*-"""len() ,len(list)方法返回列表元素个数,list -- 要计算元素个数的列表,返回值,返回列表元素个数元 ...
- Ubuntu16.04安装Maven3.5.4
本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS Maven 版本:Apache Maven 3.5.4 JDK 版本:J ...
- Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project Resource: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
1.问题描述 在 DOS 下执行 tomcat7-maven-plugin 插件部署,启动 Apache Tomcat 服务报错如下: D:\2018\code\XXX>mvn tomcat7: ...
- 在 Linux 中自动启动 Confluence 6
在 Linux/Solaris 环境下,最好的办法是对每一个服务进行安装和配置(包括 Confluence),同时配置这些服务权限为他们所在用户需要的服务权限即可, 为实例创建一个 Confluenc ...
- Confluence 6 使用 JConsole 监控远程 Confluence
针对生产系统中,我们推荐你使用远程监控,这个将不会消耗你远程 Confluence 服务器的资源. 启动远程监控: 添加下面的属性到 setenv.sh / setenv.bat 文件中,端口你可以定 ...
- cf round546 cde
第一题会卡一下同时用set和cin.. 其他的注意下矩阵对角线下标的应用即可 #include<bits/stdc++.h> using namespace std; #define ma ...
- cf1051d 简单的状态压缩dp
/* 给定一个二行n列的格子,在里面填黑白色,要求通过黑白色将格子分为k块 请问有多少种填色方式 dp[j][k][0,1,2,3] 填到第j列,有k块,第j列的颜色, */ #include< ...
- linux 压缩和解压缩
压缩 tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.ta ...
- Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]
解决方法: <select id="selectIf" resultType="student"> SELECT id,name,age,score ...