邻值查找(0x13 链表与邻接表)

简介: 笔记

邻值查找


题意

给定一个长度为 n的序列 A ,A 中的数各不相同。


对于 A 中的每一个数 A i ,求:


m i n 1 ≤ j < i ∣ A i − A j ∣


以及令上式取到最小值的 j (记为 P i )。若最小值点不唯一,则选择使 A j 较小的那个。


思路

将原数组按照权值递增排序后,构造成一个链表,然后按照输入顺序从后往前计算结果,每算出一个数 A i 的结果后,就将其从链表中删除,这样可以保证计算第 i 个数时,所有还存在的数在输入中一定在其前面 满足了题目要求的 1<=j<i


实现细节请看代码注释


代码

#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
const int N = 1e5 + 10;
int n;
PII a[N]; // 记录每个数的权值和输入的下标
PII res[N]; // 记录答案
int p[N]; // 记录每个数排序后的下标
int l[N], r[N]; // 前向指针和后向指针数组
void solve() {
  cin >> n;
  rep(i, 1, n) {
    cin >> a[i].first; // 读入权值
    a[i].second = i; // 记录下标
  }
  sort(a + 1, a + 1 + n); // 按权值递增排序
  rep(i, 1, n) {
    l[i] = i - 1; // 对排序后的数据构造链表
    r[i] = i + 1;
    p[a[i].second] = i; // 记录排序前的下标对应的排序后的下标
  }
  a[0].first = a[n + 1].first = LLONG_MAX; // 边界
  for (int i = n; i > 1; --i) { // 按输入顺序从后往前计算答案
    int j = p[i]; // j 表示第 i 个输入的数排序后在链表中的位置(下标)
    int left = l[j], right = r[j]; // 当前数在链表中的前驱节点和后继节点的下标
    int v = a[j].first; // 当前节点的权值
    int lv = abs(a[left].first - v); // 与左边节点的差的绝对值
    int rv = abs(a[right].first - v); // 与右边节点的差的绝对值
    if (lv <= rv) { // 如果当前数与 左边的数的差值 小于 与右边的数的插值 按照题目要求选择左边的数
      res[i] = { lv,a[left].second };
      // a[left].second 表示左边的数在原数组中的下标
    }
    else { // 否则选择右边的点
      res[i] = { rv,a[right].second };
    }
    // 将当前节点从链表中删除
    l[right] = left;
    r[left] = right;
  }
  // 按输入顺序输出答案
  rep(i, 2, n) {
    printf("%lld %lld\n", res[i].first, res[i].second);
  }
}
signed main() {
  // int t; cin >> t;
  // while (t--)
    solve();
  return 0;
}


目录
相关文章
|
Kubernetes 搜索推荐 网络协议
使用 kubeadm 部署 Kubernetes 集群(三)kubeadm 初始化 k8s 证书过期解决方案
使用 kubeadm 部署 Kubernetes 集群(三)kubeadm 初始化 k8s 证书过期解决方案
1180 8
|
存储 机器学习/深度学习 人工智能
【AI系统】昇腾 AI 核心单元
本文深入解析了华为昇腾AI处理器的核心——AI Core及其达芬奇架构。AI Core采用特定域架构(DSA),专为深度学习算法优化,通过矩阵、向量和标量计算单元的高效协作,实现了对深度学习算法的加速。文章详细介绍了AI Core的计算单元、存储系统及控制单元的设计,展示了其如何通过优化数据通路和控制流程,显著提升计算性能。
1275 3
|
存储 消息中间件 算法
RocketMQ平台的消息灰度方案(1)
RocketMQ平台的消息灰度方案
848 0
|
开发工具 数据安全/隐私保护 git
Git 分布式版本控制工具02
简要介绍下git的使用 帮助大家快速入门git
|
弹性计算 运维 固态存储
选择云服务器ECS还是轻量应用服务器?看完评测你就知道了
阿里云轻量应用服务器是什么意思?用户在购买云主机时该选择ECS还是轻量应用服务器呢?为什么明明已经有了规格全面的ECS云服务器之后,还要单独推出轻量应用服务器这个类型的云主机呢?对于我们用户来说阿里云轻量应用服务器和ECS云服务器哪个好? 轻量应用服务器是面向单机应用场景的新一代计算服务,提供精品应用一键部署,支持一站式的域名、网站、安全、运维、应用管理等服务,极大地优化了搭建简单应用的体验,降低了入门级用户使用云计算产品的门槛。
选择云服务器ECS还是轻量应用服务器?看完评测你就知道了
|
Cloud Native 安全 NoSQL
阿里云新品发布会周刊第69期 丨 一同见证,阿里云年度重磅发布,释放技术红利
数字时代的相聚,尽在云上云栖。下周一年一度的云栖大会精彩来袭!记得持续关注~
1196 0
阿里云新品发布会周刊第69期 丨  一同见证,阿里云年度重磅发布,释放技术红利
|
弹性计算 Apache PHP
【云计算的1024种玩法】为小伙伴搭建一个功能丰富的百度贴吧云签到
贴吧是年轻人比较喜欢逛得地方,和云栖社区一样贴吧也有个签到功能,不过云栖社区只有一个地方要签到,但是要是你泡的贴吧多了那签到就麻烦多了而且还容易忘记。这时候传说中的百度贴吧云签到就非常的实用了。
5520 0
|
存储 数据挖掘 数据库
数据库必知词汇:R-Tree
1984年,加州大学伯克利分校的Guttman发表了一篇题为“R-trees: a dynamic index structure for spatial searching”的论文,向世人介绍了R树这种处理高维空间存储问题的数据结构。R-Tree是B-Tree向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。
804 0
|
11天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
5710 51
|
29天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
40590 156
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API