博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
$[Luogu]$ 洛谷 $CF522D$ 题解【Closest Equals】
阅读量:4451 次
发布时间:2019-06-07

本文共 1451 字,大约阅读时间需要 4 分钟。

终于过了,发篇题解庆祝一下

实际上是为了不让后人没一篇优秀的题解看

进入正题

 实际上是我懒得打了

emmmm,怎么这么多实际上QAQ?

不管啦,看题,我们将相同的数作为一个区间存下来

将两个的坐标分别作为区间的左右端点

然后我们发现

如果有一个区间包含了另一个区间,那么!!!

就可以删掉那个较大的区间,是不是很神奇!是不是!是不是!

咳咳,言归正传,那么我们们在边读边做时就会自动的将区间按左端点从小到大排序

由上可知,右端点也是有序的

在每次询问时,我们可以二分一个查找,找到可以得出答案的范围

在其中找最小的区间长度,就可以啦~~~

上面的一步可以用RMQ哦QAQ

注意:当我们找出的l和r有l>r时,就输出-1啦

丢代码:

#include
using namespace std;int n,m;int a[500001],d[500001],cnt;int logg[500001];int f[500001][40];int l[500001],r[500001];map
mp;//第一个是原值,第二个是原值的位置inline int min(int a,int b){ return a
='0'&&ch<='9')) { if(ch=='-') w=1; ch=getchar(); } while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return w?-x:x;}int main(){ n=read(); m=read(); for(register int i=1;i<=n;++i) { a[i]=read(); if(mp.count(a[i])) { int j=mp.find(a[i])->second; mp[a[i]]=i; if(!cnt) l[++cnt]=j,r[cnt]=i,d[cnt]=i-j; else if(l[cnt]>=j) continue; else l[++cnt]=j,r[cnt]=i,d[cnt]=i-j; } else mp.insert(make_pair(a[i],i)); } logg[0]=-1; for(register int i=1;i<=cnt;++i) f[i][0]=d[i],logg[i]=logg[i>>1]+1; for(register int j=1;(1<
<=cnt;++j) for(register int i=1;i+(1<
<=cnt;++i) f[i][j]=min(f[i][j-1],f[i+(1<

 

转载于:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/9787496.html

你可能感兴趣的文章
kylin cube 构建过程
查看>>
结合实际业务场景聊一聊MVP模式的应用
查看>>
scrapy实例:爬取中国天气网
查看>>
经济学效应
查看>>
深圳常见问题
查看>>
入侵指定网站的一些方法(思路篇)
查看>>
【帅刺猬】用鼠标Wheel中键控制对象的缩放
查看>>
如何设计Windows商店游戏的优秀磁贴
查看>>
支付宝一(配置私钥与公钥)
查看>>
[NOIP2017]时间复杂度(模拟)
查看>>
懒加载(延迟加载)
查看>>
前端学习笔记day03 清除浮动的四种方式
查看>>
JavaScript强化教程 - 六步实现贪食蛇
查看>>
【Nginx】请求上下文
查看>>
C++ 存储类
查看>>
整数游戏 (Integer Game,UVa 11489)
查看>>
项目Beta冲刺(团队) --3/7
查看>>
手机购买怎样识别假货——一点心得体会分享!
查看>>
scrapy-redis 分布式爬虫
查看>>
【JSP运行机制】
查看>>