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
- Codeforces VK Cup 2015
- 51Nod 1524 | Codeforces VK Cup 2015
- Codeforces VK Cup 2017
- [Codeforces VK Cup 2016
- VK Cup 2015
- VK Cup 2015
- VK Cup 2015
- Codeforces VK Cup 2015 - Round 1 (Div.1 A~E)
- Codeforces VK Cup 2015 Wild Card Round 1 (AB)
- [线段树] [二分图] Codeforces VK Cup 2015
- 【codeforces VK Cup Round 1】BDE题解
- [杂题] Codeforces 772D VK Cup 2017
- [几何] Codeforces 772B VK Cup 2017
- [VK Cup 2015 - Round 1]简要题解
- VK Cup 2015 - Finals, online mirror
- 【树形DP】 codeforces VK Cup 2012 Round 1 D
- Codeforces VK Cup 2016 - Round 1 (Div. 2 Edition)
- 【VK Cup 2012】Codeforces 209C Trails and Glades
- 数字三角形
- JSP中用Ajax
- struts2+hibernate学习笔记
- 遍历列表,找出具体元素的索引
- 004使用一个栈对另一个栈完成排序(C++实现)
- Codeforces VK Cup 2015
- ListView及其ArrayAdapter的应用
- 量化投资-基本面模型-PVC多因素模型
- Linux 守护进程Daemon
- ES6之Object--构造函数与类静态方法
- POJ
- 人生
- 49. Group Anagrams
- CodeForces