Codeforces VK Cup 2015

来源:互联网 发布:三毛梦里花落知多少txt 编辑:程序博客网 时间:2024/04/20 20:04

题目链接:

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

题意:

查询区间相同数的最小距离

题解:

用一个map记录前面的位置,然后离线搞一搞
单点更新,区间查询最小值

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 5e5+10;struct node{    int l,r,v;}tree[maxn<<2];struct kk{    int l,r,id;    bool operator<(const kk& rhs) const{        return l > rhs.l;    }}qu[maxn];int d[maxn],ans[maxn];map<int,int> mp;void build(int rt,int l,int r){    tree[rt].l = l, tree[rt].r = r;    tree[rt].v = INF;    if(l == r) return ;    int mid = (l+r)/2;    build(rt<<1,l,mid);    build(rt<<1|1,mid+1,r);}void pushup(int rt){    tree[rt].v = min(tree[rt<<1].v, tree[rt<<1|1].v);}void update(int rt,int pos,int val){    int L = tree[rt].l, R = tree[rt].r;    if(L == R){        tree[rt].v = val;        return ;    }    int mid = (L+R) / 2;    if(pos <= mid) update(rt<<1,pos,val);    else update(rt<<1|1,pos,val);    pushup(rt);}int mi;void query(int rt,int l,int r){    int L = tree[rt].l, R = tree[rt].r;    if(l<=R && R<=r){        mi = min(mi,tree[rt].v);        return ;    }    int mid = (L+R)/2;    if(l<=mid) query(rt<<1,l,r);    if(r>mid) query(rt<<1|1,l,r);}int main(){    int n=read(), m=read();    build(1,1,n);    for(int i=1; i<=n; i++)        d[i] = read();    for(int i=1; i<=m; i++){        qu[i].l = read();        qu[i].r = read();        qu[i].id = i;    }    sort(qu+1,qu+1+m);    int t = 1;    for(int i=n; i>=1; i--){         if(mp[d[i]]){ // 如果已经出现过,就更新后面那个为 mp[d[i]]-i 就是隔多少个            update(1,mp[d[i]],mp[d[i]]-i);        }        mp[d[i]] = i;        while(qu[t].l == i){ // 每次查询保证前面的值不会影响到现在查询的区间,因为还没有更新。            mi = INF;            query(1,qu[t].l,qu[t].r);             if(mi == INF)                mi = -1;            ans[qu[t].id] = mi;            t++;        }    }    for(int i=1; i<=m; i++)        cout << ans[i] << endl;    return 0;}// http://codeforces.com/contest/522/problem/D
0 0
原创粉丝点击