【区间相同数的最小间隔 | 线段树】D. Closest Equals

简介: 笔记

题目描述


15.png


思路

题意: 给定一个数组,多次询问区间 [ l , r ]中相同的数的间隔的最小值。


首先拿到题目第一想法就是考虑,如何维护一个区间相同的数的间距最小值。似乎很熟悉,我们可以用线段树去维护一段区间的最小值信息。那么我们可以开数组 a aa,用来存储不同位置下,和前一位值相同的数的间距。然后我们的线段树就去维护的是数组 a aa,每次查询就返回区间的最小值即可。


但是存在这种情况: 当前询问的区间中,a i 值是最小的,但是 i 这一位对应值,它的前一位相同值并不在区间范围内。也就是说,对于这个询问来说 a i是不能产生贡献的。所以可以将其赋值为一个极大值,这也就需要线段树的单点修改操作。


那么考虑完上面的情况,我们发现如果是这样执行,每次对一个询问区间,我们需要遍历一次区间,把不应该产生贡献的值都给修改掉,并且考虑到当前修改的点,可能对后续的询问产生影响,那么我们还需要在修改回来。这样的时间复杂度是不可以接受的。所以我们实现的过程中,可以将询问进行离线。对询问的区间进行左端点排序。那么在询问完当前区间,在询问下一个区间时,两次询问的左端点之间的数,是不会在有询问的,所以其对后续的询问点的影响需要清空掉。


那么如何清空这些无用点的影响呢?


考虑到这个点对后续的影响是,在询问区间中的点,也就是下一位。所以我们可以开一个 b bb 数组,用于存储每个点它的对应的值的下一位在哪个位置。在修改的时候只需要跳到下一个位置进行修改即可。


代码

struct node {
  int l, r;
  int id;
  bool operator<(const node &A) const {
    if (l == A.l) return r < A.r;
    return l < A.l;
  }
} q[N];
int idx;
int n, m;
map<int, int> mp;
int a[N], b[N];
struct Node {
  int l, r;
  int v;
} tr[N << 2];
#define ls u<<1
#define rs u<<1|1
#define INF 2e9
void pushup(int u) {
  tr[u].v = min(tr[ls].v, tr[rs].v);
}
void build(int u, int l, int r) {
  tr[u] = {l, r};
  if (l == r) { tr[u].v = a[l]; return ; }
  int mid = l + r >> 1;
  build(ls, l, mid), build(rs, mid + 1, r);
  pushup(u);
}
int query(int u, int l, int r) {
  if (tr[u].l >= l && tr[u].r <= r) return tr[u].v;
  int mid = tr[u].l + tr[u].r >> 1;
  int res = INF;
  if (l <= mid) res = min(res, query(ls, l, r));
  if (r > mid) res = min(res, query(rs, l, r));
  return res;
}
void modify(int u, int x) {
  if (tr[u].l >= x && tr[u].r <= x) { tr[u].v = INF; return ; }
  int mid = tr[u].l + tr[u].r >> 1;
  if (x <= mid) modify(ls, x);
  else modify(rs, x);
  pushup(u);
  return ; 
}
int res[N];
// https://codeforces.com/contest/522/problem/D
void solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) a[i] = b[i] = INF;
  for (int i = 1; i <= n; i++) {
    int x; cin >> x;
    if (mp.count(x)) {
      a[i] = i - mp[x];
      b[mp[x]] = i;
    }
    mp[x] = i;
  }
  for (int i = 1; i <= m; i++) {
    int l, r; cin >> l >> r;
    q[i] = {l, r};
    q[i].id = i;
  }
  sort(q + 1, q + 1 + m);
  build(1, 1, n);
  q[m + 1].l = -1;
  for (int i = 1; i <= m; i++) {
    int l = q[i].l, r = q[i].r;
    res[q[i].id] = query(1, l, r);
    for (int p = l; p < q[i + 1].l; p++) {
      if(b[p] <= n) modify(1, b[p]);
    }
  }
  for (int i = 1; i <= m; i++) { 
    if (res[i] >= INF) res[i] = -1;
    cout << res[i] << endl;
  }
}


相关文章
|
JavaScript 安全 开发者
Vue3 中对 TypeScript 的支持
Vue3 中对 TypeScript 的支持
264 2
|
JavaScript
Vue中 Vue.use() 原理及使用
Vue中 Vue.use() 原理及使用
423 0
Vue中 Vue.use() 原理及使用
|
存储 JSON JavaScript
JavaScript深拷贝与浅拷贝
JavaScript深拷贝与浅拷贝
119 0
|
SQL 关系型数据库 MySQL
MySQL查询数据表中数据记录(包括多表查询)
MySQL查询数据表中数据记录(包括多表查询)
490 0
|
12天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
8天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
4733 14
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
9天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4849 17
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
7天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
3320 8
|
11天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7302 16