$Codeforces\ 522D\ Closest\ Equals$ 线段树
正解:线段树
解题报告:
题目大意是说给定一个数列,然后有若干次询问,每次询问一个区间内相同数字之间距离最近是多少$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 ;
}
随机推荐
- YUI css reset
*{ margin:0; padding:0; } 以前写CSS都会在会在样式的开头部分添加上述的内容,今天才发现这种写法很不友好,会导致很多样式显示问题,所以并不适合所有的浏览器. 下面的是雅虎的c ...
- oracle函数 mod(x,y)
[功能]返回x除以y的余数 [参数]x,y,数字型表达式 [返回]数字 [示例] select mod(23,8),mod(24,8) from dual; 返回:7,0
- oracle函数 localtimestamp
[功能]:返回会话中的日期和时间 [参数]:没有参数,没有括号 [返回]:日期 [示例]select localtimestamp from dual; 返回:14-11月-08 12.35.37.4 ...
- C++构造函数和文件组织
构造你的函数 在 main() 上方声明函数,并在 main 下方定义函数 在 main() 上方同时声明并定义函数. 随着 C++ 程序变得越来越复杂,你可能需要将代码分成多个文件.分开保存函数定义 ...
- Python基础:25文件
一:文件对象 文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接 ...
- js获取本周日期
JS获取到本周的日期 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- JVM参数详细列表
-client :设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) -server :设置JVM使用server模式.64位JDK默认启动该模式 -agentlib:l ...
- 2019-9-30-WPF-运行时迁移-EF-Core-数据库
title author date CreateTime categories WPF 运行时迁移 EF Core 数据库 lindexi 2019-09-30 20:19:16 +0800 2019 ...
- behavior planning——12.example cost funtion -lane change penalty
In the image above, the blue self driving car (bottom left) is trying to get to the goal (gold sta ...
- H3C 单播与广播