题解:

傻逼题

直接从左向右扫描每个点作为右端点

然后单点修改区间查询就行了

另外一种更直观的做法就是$(i,j)$之间产生了$(j-i)$

于是变成矩形查最大值,kd-tree维护

代码:

#include <bits/stdc++.h>
#define rint register int
#define IL inline
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define ll long long
namespace IO{
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; int Z,C=-;
template<class T>void wer(T x)
{
if (x<) sr[++C]='-',x=-x;
while (z[++Z]=x%+,x/=);
while (sr[++C]=z[Z],--Z);
}
IL void wer1() {sr[++C]=' ';}
IL void wer2() {sr[++C]='\n';}
template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
template<class T>IL T MAX(T x,T y) { return x>y?x:y;}
template<class T>IL T MIN(T x,T y) { return x<y?x:y;}
};
using namespace std;
using namespace IO;
const int N=6e5;
map<int,int> M;
int cnt,a[N],cmp_d,rt;
struct re{
int x,y,z;
}p[N];
bool cmp(re x,re y)
{
if (!cmp_d) return x.x<y.x;
else return x.y<y.y;
}
const int INF=1e9;
struct kd_tree{
int v[N],pv[N],ls[N],rs[N],Mx[N],Nx[N],My[N],Ny[N];
kd_tree()
{
v[]=pv[]=INF;
Nx[]=INF; Mx[]=;
Ny[]=INF; My[]=;
}
IL void updata(int x)
{
pv[x]=MIN(MIN(pv[ls[x]],pv[rs[x]]),v[x]);
Mx[x]=MAX(p[x].x,MAX(Mx[ls[x]],Mx[rs[x]]));
Nx[x]=MIN(p[x].x,MIN(Nx[ls[x]],Nx[rs[x]]));
My[x]=MAX(p[x].y,MAX(My[ls[x]],My[rs[x]]));
Ny[x]=MIN(p[x].y,MIN(Ny[ls[x]],Ny[rs[x]]));
}
int build(int h,int t,int o)
{
int x,mid; x=mid=(h+t)/;
cmp_d=o; nth_element(p+h,p+mid,p+t+,cmp);
v[x]=p[x].z;
if (h<mid) ls[x]=build(h,mid-,o^);
if (mid<t) rs[x]=build(mid+,t,o^);
updata(x);
return x;
}
int query(int x,int x1,int x2,int y1,int y2)
{
if (x1>Mx[x]||x2<Nx[x]||y1>My[x]||y2<Ny[x]) return(INF);
if (x1<=Nx[x]&&Mx[x]<=x2&&y1<=Ny[x]&&My[x]<=y2) return(pv[x]);
int ans=INF;
if (p[x].x>=x1&&p[x].x<=x2&&p[x].y>=y1&&p[x].y<=y2) ans=v[x];
mina(ans,query(ls[x],x1,x2,y1,y2));
mina(ans,query(rs[x],x1,x2,y1,y2));
return ans;
}
}K;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int n,m;
read(n); read(m);
rep(i,,n)
{
read(a[i]);
int k=M[a[i]];
if (k) p[++cnt]=(re){k,i,i-k};
M[a[i]]=i;
}
rt=K.build(,cnt,);
rep(i,,m)
{
int x,y;
read(x); read(y);
int ans=K.query(rt,x,y,x,y);
if (ans<INF) wer(ans); else wer(-);
wer2();
}
fwrite(sr,,C+,stdout);
return ;
}

Codeforces 522D Closest Equals的更多相关文章

  1. $Codeforces\ 522D\ Closest\ Equals$ 线段树

    正解:线段树 解题报告: 传送门$QwQ$ 题目大意是说给定一个数列,然后有若干次询问,每次询问一个区间内相同数字之间距离最近是多少$QwQ$.如果不存在相同数字输出-1就成$QwQ$ 考虑先预处理出 ...

  2. codeforces 522D. Closest Equals 线段树+离线

    题目链接 n个数m个询问, 每次询问输出给定区间中任意两个相同的数的最近距离. 先将询问读进来, 然后按r从小到大排序, 将n个数按顺序插入, 并用map统计之前是否出现过, 如果出现过, 就更新线段 ...

  3. CodeForces 522D Closest Equals 树状数组

    题意: 给出一个序列\(A\),有若干询问. 每次询问某个区间中值相等且距离最短的两个数,输出该距离,没有则输出-1. 分析: 令\(pre_i = max\{j| A_j = A_i, j < ...

  4. Codeforces VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线线段树 求区间相同数的最小距离

    D. Closest Equals Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/prob ...

  5. VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线+线段树

    题目链接: http://codeforces.com/problemset/problem/522/D D. Closest Equals time limit per test3 secondsm ...

  6. D. Closest Equals(线段树)

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

  7. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  8. Codeforces 962D - Merge Equals

    链接: http://codeforces.com/problemset/problem/962/D 题意: 给出一个整数序列.选择其中最小且出现两次(或以上)的数,把最左边的两个从序列中移除,然后把 ...

  9. [CF522D]Closest Equals

    题目大意:给一个区间,多次询问,每次问区间$[l,r]$里最近的两个相同的数的距离是多少. 题解:用一个数组$pre_i$表示第$i$个数前面最近的一个相同的数在哪,询问变成了询问$[l,r]$中$i ...

随机推荐

  1. 建立ftp服务器的网址

    https://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html

  2. 电脑重装系统后如何恢复 Mysql 数据库

    电脑重装系统后如何恢复 Mysql 数据库 一.[设置mysql的path] 比如:我的mysql在:D:\DataBase\mysql-5.7.13-winx64,可以在环境变量中重新新建一个环境变 ...

  3. Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)

    做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...

  4. CF932 E. Team Work 结题报告

    CF932 E. Team Work 题意 求 \[ \sum_{i=0}^n\binom{n}{i}i^k \] 其中\(n\le 10^9,k\le 5000\),对\(mod=998244353 ...

  5. CRLF在过滤XSS语句后打Cookie方式

    看了很长时间的漏洞奖励计划,学到了不少骚姿势,我觉得这个姿势很不错,总结下写篇文章发出来.针对CRLF漏洞打cookie的方法. 这里不讲概念挖掘方式了,以实战为主: 阅读文章前先参考文章:http: ...

  6. [HAOI2008]糖果传递 结论题

    题目描述 有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价. 暴力 ...

  7. ADO.NET中的五大内置对象

    ADO.NET中的五大内置对象 学习链接:https://blog.csdn.net/wxr15732623310/article/details/51828677

  8. 系统磁盘优化——"/var/spool/postfix/maildrop"

    文件清理 最近某服务器磁盘空间告警,在排查过程中发现"/var/spool/postfix/maildrop"目录下堆积了很多小文件,起初想直接删除,但是使用rm删除是提示“参数列 ...

  9. openstack项目【day23】:KVM介绍

    阅读目录 什么是kvm 为何要用kvm kvm的功能 常见虚拟化模式 KVM架构 KVM工具集合 一 什么是kvm KVM 全称 Kernel-Based Virtual Machine.也就是说 K ...

  10. solr的搜索

    主要讲一下solr面板的使用: 查询 q:     查询用  语法: name:刘中华      支持通配符 ? 表示单个任意字符的通配 * 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号 ...