[CF522D]Closest Equals
题目大意:给一个区间,多次询问,每次问区间$[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相关推荐
- D. Closest Equals(线段树)
题目链接: D. Closest Equals time limit per test 3 seconds memory limit per test 256 megabytes input stan ...
- SCAU-春季训练-不应该啊(怎么这么菜。。。)
2021/3/14 春季训练2(难度div2d) 反思:(赛前,看什么crt,赛时满脑子都是线性方程组,....................................) 最近表现都不太好.. ...
- Codeforces上几个非常妙的数据结构题
Codeforces 833B The Bakery Codeforces 633H Fibonacci-ish II Codeforces 522D Closest Equals Codeforce ...
- DCP(Deep Closest Point)论文阅读笔记以及详析
DCP论文阅读笔记 前言 本文中图片仓库位于github,所以如果阅读的时候发现图片加载困难.建议挂个梯子. 作者博客:https://codefmeister.github.io/ 转载前请联系作者 ...
- equals()与hashCode()
什么是hashCode()? hashCode()的作用是获取哈希码,也称作为散列码.它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中 索引的位置.hashCode()定义在Obj ...
- java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.String.equals(j
今天切正式环境出现的空指针 记录一下 下面是错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean j ...
- 关于 hashcode 和 equals
首先需要明白 hashCode() 和equals是Object类中已经被定义好的,所以在java中定义的任何类都有这两个方法.其中原始的equals()方法是用来比较两个对象的地址值,而原始的has ...
- JAVA-初步认识-第十一章-object类-equals方法覆盖
一. 现在要谈论equals方法另一个方面.如果不写equals方法,直接用==来比较也是可以的,貌似equals方法有点多余. 现在不比较对象是否相等,而是比较对象中的特定内容,比如说对象的年龄,之 ...
- String比较.equals
首先定义四个变量str public class SIzhui {public static void main(String[] args) {String str1="wang" ...
最新文章
- mysql引号问题_MySQL中引号的问题
- Python使用SMTP发送邮件
- Xpath语法学习记录
- 网站访问量怎么刷_基于爬虫刷新某网站访问量!我说怎么上千万呢
- 实现数组和List之间的相互转换
- 【python】lambda函数
- 分享50佳高质量免费按钮图标资源(上篇)[zz]
- 把C#对象转换为json字符串
- [19/04/29-星期一] GOF23_行为型模式(责任链模式、迭代器模式)
- 推荐使用MEF降低耦合(2)
- 什么是Proxy Server
- 利用Matlab进行图像处理
- ENVI5.2裁剪遥感图像指定区域
- SpringSecurity实现登陆认证并返回token
- Dev中的GridControl中根据条件显示背景色
- 账号被罚了,申诉的结果出来了,果然
- Compose也能跨平台?Compose Multiplatform是啥?KMM又是什么?
- python的图导入origin,导入Numpy或OriginPro和Python时出现问题
- 全球顶尖大学已将区块链加入其课程
- Cesium球心坐标与本地坐标系经纬转换的数学原理—矩阵变换
热门文章
- 移动互联网改变商业环境:商品的颠覆
- 零距离感受2015年安全***大赛:静动之美 ***兼备
- Media Player网页播放音频,视频,图片总汇
- 程序员难逃二八法则,如何晋升为头部20%玩家?
- 【RPA干货来袭】 UiBot关于如何使用浏览器调用JS命令的说明
- 重新启动Office 365迁移任务
- SpringBoot 2.0 系列001 -- 入门介绍以及相关概念
- javascript中的事件问题的总结
- Nodejs+Express学习二(Mongoose基础了解)
- AutoCAD.net/Map 3D/AIMS/MapGuide/Civil 3D二次开发学习指南