1301 邻值查找 0x10「基本数据结构」例题

描述

给定一个长度为 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或者是链表实现

读入第i个时,加入set,set中存的就是i之前的所有数,而且set是默认排好序的。

然后find找到i的位置,|Aj-Ai|最小的一定是Ai的前驱或者后继。

判断一下就行了。要注意Ai就是set的头或尾的情况。

奇怪的是,用printf输出的时候有一点问题不知道是为什么,用cout就行。

 // ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// //#include "pch.h"
#include <iostream>
#include <set>
#include <cmath>
#include <stdio.h>
using namespace std; int n;
const int maxn = 1e5 + ;
struct node {
int a;
int id;
bool operator < (const node &b)const {
return a < b.a;
}
}A[maxn];
set<node>sss;
set<node>::iterator after;
set<node>::iterator before; int main()
{
scanf("%d", &n);
scanf("%d", &A[].a);A[].id = ;
sss.clear();
sss.insert(A[]);
for (int i = ; i <= n; i++) {
scanf("%d", &A[i].a);
A[i].id = i;
sss.insert(A[i]);
after = sss.find(A[i]);
before = sss.find(A[i]);
//cout<<(*after).id<<endl;
if (after == sss.begin()) {
after++;
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
//printf("%d %d\n", abs((*after).a - A[i].a), (*after).id);
}
else if (after++, after == sss.end()) {
before--;
//node tmp = *before;
//printf("%d\n", tmp.a);
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
//printf("%d %d\n", abs((*before).a - A[i].a), (*before).id);
}
else {
before--;
if (abs((*before).a - A[i].a) < abs((*after).a - A[i].a)) {
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
}
else if(abs((*before).a - A[i].a) > abs((*after).a - A[i].a)){
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
}
else {
if ((*before).a < (*after).a) {
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
}
else {
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
}
}
}
}
}

CH1301 邻值查找【set应用】的更多相关文章

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

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

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

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

  3. 1301 邻值查找(set 平衡树 | 链表)

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

  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. Java枚举-通过值查找对应的枚举

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

  9. C#算法设计查找篇之03-插值查找

    插值查找(Interpolation Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/701 访问. 插值 ...

随机推荐

  1. Spring 4 官方文档学习(十)数据访问之OXM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...

  2. Zookeeper CLI

    ZooKeeper命令行界面(CLI)用于与ZooKeeper集合进行交互以进行开发.它有助于调试和解决不同的选项. 要执行ZooKeeper CLI操作,首先打开ZooKeeper服务器(“bin/ ...

  3. Wellner 自适应阈值二值化算法

    参考文档: Adaptive Thresholding for the DigitalDesk.pdf       Adaptive Thresholding Using the Integral I ...

  4. 【Java面试题】49 垃圾回收的优点和原理。并考虑2种回收机制。

    1.Java语言最显著的特点就是引入了垃圾回收机制,它使java程序员在编写程序时不再考虑内存管理的问题. 2.由于有这个垃圾回收机制,java中的对象不再有“作用域”的概念,只有引用的对象才有“作用 ...

  5. NGUI与EasyTouch结合使用

    用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行.这篇文章我就来说说EasyTouch和NGUI的结合. 总体来说触摸屏幕也就三种情况. 1.触摸事件只响应NGUI部分,不响 ...

  6. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

  7. Unity3d导出安卓版本

    1. 要想导出安卓版,就必须要安装安卓 SDK,这个可以去这里下载. http://developer.android.com/sdk/index.html.  当我们打开后就是看见这个了. 2.当我 ...

  8. ADO 调用Execute失败,异常码DB_E_DATAOVERFLOW

    今天,通过ADO接口往PG数据库中插入数据,结果数据始终不能插入到数据库的表中,执行insert语句后,返回失败,错误码DB_E_DATAOVERFLOW. DB_E_DATAOVERFLOW:命令中 ...

  9. Visual Basic的未来之路

        Green首先列出了当时使用VB进行开发的四个基础指导原则:         1.VB和C#共享的通用IDE和平台构建块.         2.共享的“多范式.面向对象.命令式.强类型等”语言 ...

  10. [转]ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB

    您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity ...