正解:线段树

解题报告:

传送门$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. laravel重定向到上一个页面怎么带参数返回 withsucess 成功提示信息

    //控制器中 return back()->with('success','操作成功'); //with的参数1是一个session变量名,参数2为该session变量值,在视图直接这样获取 @ ...

  2. 【iOS知识学习】_int、NSInteger、NSUInteger、NSNumber的差别和联系

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/weasleyqi/article/details/33396809 1.首先先了解下NSNumber ...

  3. Streamy障碍一:大批量条目

  4. 学习canvas画布

    我们可以用画布(Canvas)绘制各种图形,下面代码是绘制的一个圆形: <!DOCTYPE html> <html> <head> <title>Can ...

  5. Laravel 上传excel,读取并写入数据库 (实现自动建表、存记录值

    <?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminat ...

  6. 上传图片保存到MySql数据库并显示--经验证有效

    以下方法仅供参考,只是介绍下这一种方法而已.欢迎指正!! 前台(image.html):  1<html> 2<head> 3<title>上传图片</tit ...

  7. [转]Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  8. 最小生成树kruskal算法、

    克鲁斯卡尔(kruskal) //kruskal算法生成最小生成树. //对边集数组Edge结构的定义 typedef struct { int begin; int end; int weight; ...

  9. Date和Calendar

    处理日期,时间: 大部分的方法已过时,不推荐使用,但是你使用过时的方法也不会报错. Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒). Date(long date) ...

  10. H3C 显示OSPF的链路状态数据库