题目大意:给一个区间,多次询问,每次问区间$[l,r]$里最近的两个相同的数的距离是多少。

题解:用一个数组$pre_i$表示第$i$个数前面最近的一个相同的数在哪,询问变成了询问$[l,r]$中$i-pre_i$的最小值,且$pre_i\in[l,r]$。难度就在处理$pre_i\not\in[l,r]$上。

$$
\because pre_i<i,i\in[l,r]\\
\therefore pre_i<r\\
若pre_i\not\in[l,r]\\
则pre_i<l
$$

这题没有修改,可以把询问按$l$排序,把不合法的点贡献去掉

卡点:$map$没更新

C++ Code:

#include <cstdio>
#include <algorithm>
#include <map>
#define maxn 500010
const int inf = 0x3f3f3f3f;
inline int min(int a, int b) {return a < b ? a : b;}int a[maxn], pre[maxn], nxt[maxn];
std::map<int, int> mp;
struct Query {int l, r, id;inline bool operator < (const Query &rhs) const {return l < rhs.l;}
} Q[maxn];
int ans[maxn];int V[maxn << 2];
inline void update(int rt) {V[rt] = min(V[rt << 1], V[rt << 1 | 1]);
}
void build(int rt, int l, int r) {if (l == r) {if (pre[l]) V[rt] = l - pre[l];else V[rt] = inf;return ;}int mid = l + r >> 1;build(rt << 1, l, mid);build(rt << 1 | 1, mid + 1, r);update(rt);
}
void modify(int rt, int l, int r, int p) {if (l == r) {V[rt] = inf;return ;}int mid = l + r >> 1;if (p <= mid) modify(rt << 1, l, mid, p);else modify(rt << 1 | 1, mid + 1, r, p);update(rt);
}
int query(int rt, int l, int r, int L, int R) {if (L <= l && R >= r) return V[rt];int mid = l + r >> 1, ans = inf;if (L <= mid) ans = query(rt << 1, l, mid, L, R);if (R > mid) ans = min(ans, query(rt << 1 | 1, mid + 1, r, L, R));return ans;
}int n, m;
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", a + i);if (mp.count(a[i])) pre[i] = mp[a[i]], nxt[mp[a[i]]] = i, mp[a[i]] = i;else pre[i] = 0, mp[a[i]] = i;}for (int i = 1; i <= m; i++) {scanf("%d%d", &Q[i].l, &Q[i].r);Q[i].id = i;}std::sort(Q + 1, Q + m + 1);build(1, 1, n);int last = 1;for (int i = 1; i <= m; i++) {int l = Q[i].l;for (; last < l; last++) {if (nxt[last] >= l) modify(1, 1, n, nxt[last]);}ans[Q[i].id] = query(1, 1, n, l, Q[i].r);}for (int i = 1; i <= m; i++) if (ans[i] != inf) printf("%d\n", ans[i]);else puts("-1");return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9781810.html

[CF522D]Closest Equals相关推荐

  1. D. Closest Equals(线段树)

    题目链接: D. Closest Equals time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  2. SCAU-春季训练-不应该啊(怎么这么菜。。。)

    2021/3/14 春季训练2(难度div2d) 反思:(赛前,看什么crt,赛时满脑子都是线性方程组,....................................) 最近表现都不太好.. ...

  3. Codeforces上几个非常妙的数据结构题

    Codeforces 833B The Bakery Codeforces 633H Fibonacci-ish II Codeforces 522D Closest Equals Codeforce ...

  4. DCP(Deep Closest Point)论文阅读笔记以及详析

    DCP论文阅读笔记 前言 本文中图片仓库位于github,所以如果阅读的时候发现图片加载困难.建议挂个梯子. 作者博客:https://codefmeister.github.io/ 转载前请联系作者 ...

  5. equals()与hashCode()

    什么是hashCode()? hashCode()的作用是获取哈希码,也称作为散列码.它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中 索引的位置.hashCode()定义在Obj ...

  6. java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.String.equals(j

    今天切正式环境出现的空指针 记录一下 下面是错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean j ...

  7. 关于 hashcode 和 equals

    首先需要明白 hashCode() 和equals是Object类中已经被定义好的,所以在java中定义的任何类都有这两个方法.其中原始的equals()方法是用来比较两个对象的地址值,而原始的has ...

  8. JAVA-初步认识-第十一章-object类-equals方法覆盖

    一. 现在要谈论equals方法另一个方面.如果不写equals方法,直接用==来比较也是可以的,貌似equals方法有点多余. 现在不比较对象是否相等,而是比较对象中的特定内容,比如说对象的年龄,之 ...

  9. String比较.equals

    首先定义四个变量str public class SIzhui {public static void main(String[] args) {String str1="wang" ...

最新文章

  1. mysql引号问题_MySQL中引号的问题
  2. Python使用SMTP发送邮件
  3. Xpath语法学习记录
  4. 网站访问量怎么刷_基于爬虫刷新某网站访问量!我说怎么上千万呢
  5. 实现数组和List之间的相互转换
  6. 【python】lambda函数
  7. 分享50佳高质量免费按钮图标资源(上篇)[zz]
  8. 把C#对象转换为json字符串
  9. [19/04/29-星期一] GOF23_行为型模式(责任链模式、迭代器模式)
  10. 推荐使用MEF降低耦合(2)
  11. 什么是Proxy Server
  12. 利用Matlab进行图像处理
  13. ENVI5.2裁剪遥感图像指定区域
  14. SpringSecurity实现登陆认证并返回token
  15. Dev中的GridControl中根据条件显示背景色
  16. 账号被罚了,申诉的结果出来了,果然
  17. Compose也能跨平台?Compose Multiplatform是啥?KMM又是什么?
  18. python的图导入origin,导入Numpy或OriginPro和Python时出现问题
  19. 全球顶尖大学已将区块链加入其课程
  20. Cesium球心坐标与本地坐标系经纬转换的数学原理—矩阵变换

热门文章

  1. 移动互联网改变商业环境:商品的颠覆
  2. 零距离感受2015年安全***大赛:静动之美 ***兼备
  3. Media Player网页播放音频,视频,图片总汇
  4. 程序员难逃二八法则,如何晋升为头部20%玩家?
  5. 【RPA干货来袭】 UiBot关于如何使用浏览器调用JS命令的说明
  6. 重新启动Office 365迁移任务
  7. SpringBoot 2.0 系列001 -- 入门介绍以及相关概念
  8. javascript中的事件问题的总结
  9. Nodejs+Express学习二(Mongoose基础了解)
  10. AutoCAD.net/Map 3D/AIMS/MapGuide/Civil 3D二次开发学习指南