题目链接:

http://codeforces.com/problemset/problem/522/D

D. Closest Equals

time limit per test3 seconds
memory limit per test256 megabytes
#### 问题描述
> You are given sequence a1, a2, ..., an and m queries lj, rj (1 ≤ lj ≤ rj ≤ n). For each query you need to print the minimum distance between such pair of elements ax and ay (x ≠ y), that:
>
> both indexes of the elements lie within range [lj, rj], that is, lj ≤ x, y ≤ rj;
> the values of the elements are equal, that is ax = ay.
> The text above understands distance as |x - y|.

输入

The first line of the input contains a pair of integers n, m (1 ≤ n, m ≤ 5·105) — the length of the sequence and the number of queries, correspondingly.

The second line contains the sequence of integers a1, a2, ..., an ( - 109 ≤ ai ≤ 109).

Next m lines contain the queries, one per line. Each query is given by a pair of numbers lj, rj (1 ≤ lj ≤ rj ≤ n) — the indexes of the query range limits.

输出

Print m integers — the answers to each query. If there is no valid match for some query, please print -1 as an answer to this query.

样例输入

5 3

1 1 2 3 2

1 5

2 4

3 5

样例输出

1

-1

2

题意

求区间内相邻最近的两个相同的数的距离。

题解

线段树,先处理出所有的相同的数的相邻的间隔区间,把这些区间(之后称为事件)按右端点排序,对于所有的查询区间也同样排序,然后一边扫查询,一边插入事件,事件按左端点插入,值为区间大小。

代码

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=5e5+10; int minv[maxn<<2]; int ql,qr,qmin;
void query(int o,int l,int r){
if(ql<=l&&r<=qr){
qmin=min(qmin,minv[o]);
}else{
if(ql<=mid) query(lson,l,mid);
if(qr>mid) query(rson,mid+1,r);
}
} int _p,uv;
void update(int o,int l,int r){
if(l==r){
minv[o]=uv;
}else{
if(_p<=mid) update(lson,l,mid);
else update(rson,mid+1,r);
minv[o]=min(minv[lson],minv[rson]);
}
} struct Node{
int l,r,v;
Node(int l,int r,int v):l(l),r(r),v(v){}
}; bool cmp(const Node& n1,const Node& n2){
return n1.r<n2.r;
} map<int,int> mp;
int ans[maxn],arr[maxn],n,m; void init(){
rep(i,0,maxn<<2) minv[i]=INF;
} int main() {
scf("%d%d",&n,&m);
init();
vector<Node> lis;
for(int i=1;i<=n;i++){
scf("%d",&arr[i]);
if(mp[arr[i]]){
lis.pb(Node(mp[arr[i]],i,i-mp[arr[i]]));
}
mp[arr[i]]=i;
} // rep(i,0,lis.sz()) prf("(%d,%d)\n",lis[i].l,lis[i].r); vector<Node> que;
for(int i=0;i<m;i++){
int l,r;
scf("%d%d",&l,&r);
que.pb(Node(l,r,i));
} sort(all(lis),cmp);
sort(all(que),cmp); int p=0;
for(int i=0;i<que.sz();i++){
while(p<lis.sz()&&lis[p].r<=que[i].r){ _p=lis[p].l; uv=lis[p].v;
update(1,1,n); p++;
} ql=que[i].l,qr=que[i].r,qmin=INF;
query(1,1,n); ans[que[i].v]=qmin>=INF?-1:qmin;
} for(int i=0;i<m;i++) prf("%d\n",ans[i]); return 0;
} //end-----------------------------------------------------------------------

VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线+线段树的更多相关文章

  1. 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 ...

  2. codeforces VK Cup 2015 - Qualification Round 1 B. Photo to Remember 水题

    B. Photo to Remember Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/522/ ...

  3. VK Cup 2015 - Qualification Round 1 A. Reposts [ dp DAG上最长路 ]

    传送门 A. Reposts time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. DP VK Cup 2012 Qualification Round D. Palindrome pairs

    题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...

  5. VK Cup 2012 Qualification Round 1 C. Cd and pwd commands 模拟

    C. Cd and pwd commands Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  6. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 字符串模拟

    C. String Manipulation 1.0 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/pr ...

  7. VK Cup 2012 Qualification Round 1---C. Cd and pwd commands

    Cd and pwd commands time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  8. VK Cup 2016 - Qualification Round 2 B. Making Genome in Berland

    今天在codeforces上面做到一道题:http://codeforces.com/contest/638/problem/B 题目大意是:给定n个字符串,找到最短的字符串S使得n个字符串都是这个字 ...

  9. VK Cup 2016 - Qualification Round 2 D. Three-dimensional Turtle Super Computer 暴力

    D. Three-dimensional Turtle Super Computer 题目连接: http://www.codeforces.com/contest/638/problem/D Des ...

随机推荐

  1. float(浮动)的属性和使用方法

    1float浮动的属性值 left:向左浮动 right:向右浮动 2.当父元素未浮动,子元素浮动时,就会造成浮动塌陷 实例: 父元素: #mainDiv{ border: 5px solid red ...

  2. 在客户端模拟调用srv和topic

    rostopic pub -r 10 /toipic_name Tab+Tab rosservice call /service_name  Tab+Tab rostopic pub -r 10 /c ...

  3. 从网上下载小说_keywords:python、multiprocess

    # -*- coding: utf-8 -*- __author__ = "YuDian" from multiprocessing import Pool # Pool用来创建进 ...

  4. 20+ Docs and Guides for Front-end Developers (No. 5)

    It’s that time again to choose the tool or technology that we want to brush up on. If you feel like ...

  5. 20155307 实验一《Java开发环境的熟悉》实验报告

    (一)命令行下Java程序开发 题目:实现Fibonacci数列功能,并进行测试 命令行下的程序截图 上传到了码云: 遇到的问题? 可以直接使用Javac,不加环境变量也行,但是文件的名字与类名必须一 ...

  6. java 万能转换器 输入SQL 直接得到ArrayList

    //java万能List转换器 public static <T> ArrayList<T> ToList(Class<T> clazz,String sql) t ...

  7. eclipse jetty debug

    一.    1, Eeclipse中选择 Run --> External Tools --> External Tools Configurations 然后new一个Program项. ...

  8. 关于nginx反向代理504 gateway time-out配置

    问题描述: 使用nginx的默认配置用作后端处理服务的反向代理,针对处理时间超过1分钟的请求,返回504 gateway time-out,但后端服务还在执行中. 原因分析: nginx代理默认超时时 ...

  9. activeX 打包

    原文 http://www.docin.com/p-409284488.html CAB打包文档说明 文档目的 本文档的目的在于说明将ocx和dll以及相关的文件打包成一个CAB包,以便在网页下调用o ...

  10. Qt 将字符串转成16进制显示

    最近项目用到了需要将字符串转换成16进制显示.这玩意折腾了一上午. 首先,数据块内容 struct UserData { char Head[3] = {'X','J','J'}; char Flag ...