正解:线段树

解题报告:

传送门$QwQ$

题目大意是说给定一个数列,然后有若干次询问,每次询问一个区间内相同数字之间距离最近是多少$QwQ$.如果不存在相同数字输出-1就成$QwQ$

考虑先预处理出每个点的$pre$和$lst$,就前一个相同数字的位置和后一个相同数字的位置$QwQ$,然后在线段树上维护下每个点到达前一个相同数字的最短距离

然后对询问按左端点排序,每次查询右端点区间内的$min$就成,然后删去数的话就把它后一个数字的那个最短距离$update$成$inf$就成鸭$QwQ$

然后就做完了?$QwQ$(话说这个为什么是个黑昂,,,什么瞎评分昂_(:з」∠)_

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=5e5+;
int n,m,nxt[N],as[N],nw=,inf,tr[N<<];
struct node{int l,r,id;}nod[N];
map<int,int>M; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(node gd,node gs){return gd.l<gs.l;}
void modify(ri nw,ri l,ri r,ri to,ri dat)
{
if(l==r)return void(tr[nw]=dat);
ri mid=(l+r)>>;mid>=to?modify(nw<<,l,mid,to,dat):modify(nw<<|,mid+,r,to,dat);
tr[nw]=min(tr[nw<<],tr[nw<<|]);
}
int query(ri nw,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return tr[nw];
ri mid=(l+r)>>,ret=inf;
if(mid>=to_l)ret=query(nw<<,l,mid,to_l,to_r);
if(mid<to_r)ret=min(ret,query(nw<<|,mid+,r,to_l,to_r));
return ret;
} int main()
{
// freopen("522d.in","r",stdin);freopen("522d.out","w",stdout);
n=read();m=read();memset(tr,,sizeof(tr));inf=tr[];
rp(i,,n)
{
ri tmp=read();
if(M[tmp])nxt[M[tmp]]=i,modify(,,n,i,i-M[tmp]);
M[tmp]=i;
}
rp(i,,m)nod[i]=(node){read(),read(),i};sort(nod+,nod++m,cmp);
rp(i,,m)
{
while(nw<nod[i].l){if(nxt[nw])modify(,,n,nxt[nw],inf);++nw;}
as[nod[i].id]=query(,,n,,nod[i].r);
}
rp(i,,m)printf("%d\n",(as[i]==inf?-:as[i]));
return ;
}

随机推荐

  1. 谈一谈Python的上下文管理器

    经常在Python代码中看到with语句,仔细分析下,会发现这个with语句功能好强,可以自动关闭资源.这个在Python中叫上下文管理器Context Manager.那我们要怎么用它,什么时候用它 ...

  2. notepad++最有用的快捷键

    Ctrl+Tab  实现在多个打开的窗口间切换 Ctrl+Shift+Q 区块注释 Ctrl+K  行注释 Tab 缩进 Shift+Tab 删除缩进 先按住键盘上的“ctrl”键不放,然后滚动鼠标的 ...

  3. Streamy 解决办法

  4. <肖申克的救赎>观后感

    肖申克的救赎主要讲述了银行家安迪在不健全的法律制度下被陷害进入了--鲨堡监狱,最后为了重见光明.追求自由,实现“自我救赎”的故事. 1.希望是件好东西,也许是世上最好的东西.好东西从来不会流逝. Ho ...

  5. oracle函数 power(x,y)

    [功能]返回x的y次幂 [参数]x,y 数字型表达式 [返回]数字 [示例] select power(2.5,2),power(1.5,0),power(20,-1) from dual; 返回:6 ...

  6. 深度学习(二十九)Batch Normalization 学习笔记

    Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...

  7. iptables发布内部网络服务器

    要使因特网上的计算机访问到内部网的FTP服务器.WEB服务器,在做为防火墙的计算机上应添加以下规则: 1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 发 ...

  8. git分支合并及冲突解决

    小明在愉快的敲代码 vim ok 他在ok里敲了simachanping git commit -am "commit first version by xiaoming" 然后这 ...

  9. Python--day63--单表的增删改查/GET和POST/request相关知识点回顾

  10. svn 删除、移动和改名

    删除.移动和改名 Subversion allows renaming and moving of files and folders. So there are menu entries for d ...