求区间内相差最小的两个数的差

分sqrt(n)块,预处理两个数在块内,以及一个数在块内一个数在零散部分的情况,询问时归并排序处理两个数都在零散部分的情况,时间复杂度$O((n+q)\sqrt{n})$。

#include<bits/stdc++.h>
const int N=,inf=0x7fffffff;
char ib[N*],*ip=ib;
int _(){
int x=;
while(*ip<)++ip;
while(*ip>)x=x*+*ip++-;
return x;
}
int abs(int x){return x>?x:-x;}
int min(int a,int b){return a<b?a:b;}
void mins(int&a,int b){if(a>b)a=b;}
int n,m,B,bid[N],ls[],rs[],mb[N],bc=,f[N][],ans,bb[][],av[N];
struct pos{
int x,y;
bool operator<(const pos&w)const{return y<w.y;}
}as[N],bs[N];
void block(int l,int r,int c){
std::sort(as+l,as+r+);
ls[c]=l,rs[c]=r;
for(int i=l;i<=r;++i)bid[i]=c,av[i]=as[i].y;
bb[c][c]=inf;
for(int i=l+;i<=r;++i)mins(bb[c][c],av[i]-av[i-]);
}
void get(int l,int r){
int R=rs[bid[l]],xp=,xs[];
for(int i=ls[bid[l]];i<=R;++i)if(as[i].x>=l&&as[i].x<=r)xs[xp++]=as[i].y;
for(int i=;i<xp;++i)mins(ans,xs[i]-xs[i-]);
}
void get(int l,int pl,int pr,int r){
int L=bid[l],R=bid[r],ys[],yp=,yl=,zs[],zp=;
for(int i=ls[L];i<=rs[L];++i)if(as[i].x>=l)ys[yp++]=as[i].y;
ys[yp]=inf;
for(int i=ls[R];i<=rs[R];++i)if(as[i].x<=r){
int y=as[i].y;
for(;ys[yl]<y;zs[zp++]=ys[yl++]);
zs[zp++]=y;
}
for(;yl<yp;zs[zp++]=ys[yl++]);
for(int i=;i<zp;++i)mins(ans,zs[i]-zs[i-]);
}
int cal(int l,int r){
int zs[],zp=;
bb[l][r]=min(bb[l+][r],bb[l][r-]);
int*al=av+ls[l],*ar=av+rs[l]+;
int*bl=av+ls[r],*br=av+rs[r]+;
while(al!=ar&&bl!=br)zs[zp++]=*al<*bl?*al++:*bl++;
while(al!=ar)zs[zp++]=*al++;
while(bl!=br)zs[zp++]=*bl++;
for(int i=;i<zp;++i)mins(bb[l][r],zs[i]-zs[i-]);
}
int main(){
fread(ib,,sizeof(ib),stdin);
n=_(),m=_();
B=sqrt(n);
for(int i=;i<=n;++i){
int y=_();
as[i]=bs[i]=(pos){i,y};
}
for(int i=;i<=n;i+=B)block(i,min(i+B-,n),++bc);
for(int l=bc;l;--l){
for(int r=l+;r<=bc;++r)cal(l,r);
}
std::sort(bs+,bs+n+);
for(int i=;i<=bc;++i)mb[i]=-inf/;
for(int i=;i<=n;++i){
int x=bs[i].x,y=bs[i].y;
for(int j=;j<=bc;++j)f[x][j]=y-mb[j];
mb[bid[x]]=y;
}
for(int i=;i<=bc;++i)mb[i]=inf;
for(int i=n;i;--i){
int x=bs[i].x,y=bs[i].y;
for(int j=;j<=bc;++j)mins(f[x][j],mb[j]-y);
for(int j=bid[x]+;j<=bc;++j)mins(f[x][j],f[x][j-]);
for(int j=bid[x]-;j>=;--j)mins(f[x][j],f[x][j+]);
mb[bid[x]]=y;
}
while(m--){
int l=_(),r=_();
int L=bid[l],R=bid[r];ans=inf;
if(L==R)get(l,r);
else{
int pl=rs[L],pr=ls[R];
get(l,pl,pr,r);
if(R-L>){
mins(ans,bb[++L][--R]);
for(int i=l;i<=pl;++i)mins(ans,f[i][R]);
for(int i=pr;i<=r;++i)mins(ans,f[i][L]);
}
}
printf("%d\n",ans);
}
return ;
}

bzoj5052: 繁忙的财政官的更多相关文章

  1. CEO、COO、CFO、CTO

    CEO.COO.CFO.CTO是什么意思? 网站里的各种职位: CEO(Chief executive officer)首席执行官 类似总经理.总裁,是企业的法人代表. COO(Chief opera ...

  2. 转:CEO, CFO, CIO, CTO, CSO是什么

    转自:https://club.1688.com/threadview/26957122.html CEO, CFO, CIO, CTO, CSO是什么?(现在O太多了) 帖子创建时间:  2009年 ...

  3. IT业常见职位英语缩写全攻略及详解

    现在中国人流行起英文名字,连职位也跟着作秀,什么CEO.COO.CFO.CTO.CIO啦,那CEO.COO.CFO.CTO.CIO到底是什么意思呢?总被这些概念搞晕,这可不是搞IT的应该犯的错误哦,好 ...

  4. 如何成为出色的IT项目经理:成功的五个关键因素

    “出色”的IT 项目经理的定义不是一成不变的.随着经济和商业因素的改变,项目经理的角色进行调整以适应新的需求,迎接新的挑战. 除了一般的困惑之外,还有一种看法就是,在组织中,不同的人对于项目经理的看法 ...

  5. 马婕 2014年MBA,mpacc备考 报刊宣读1 中国的电子商务(转)

    http://blog.sina.com.cn/s/blog_3e66af4601015fxi.html 中国电子商务蓄势待发 Chinese e-commerce中国电子商务Pity the par ...

  6. Erlang epmd官方文档中文翻译

    本文含epmd简介及官方文档之翻译,文档地址 http://erlang.org/doc/man/epmd.html翻译时的版本 R19.1 中英文水平都不咋地,不通顺处海涵,就酱. 简介 Erlan ...

  7. Mysql怎么判断繁忙 checkpoint机制 innodb的主要参数

    Mysql怎么判断繁忙,innodb的主要参数,checkpoint机制,show engine innodb status   2018年07月13日 15:45:36 anzhen0429 阅读数 ...

  8. hbase官方文档(转)

    FROM:http://www.just4e.com/hbase.html Apache HBase™ 参考指南  HBase 官方文档中文版 Copyright © 2012 Apache Soft ...

  9. HBase官方文档

    HBase官方文档 目录 序 1. 入门 1.1. 介绍 1.2. 快速开始 2. Apache HBase (TM)配置 2.1. 基础条件 2.2. HBase 运行模式: 独立和分布式 2.3. ...

随机推荐

  1. MySql查询出来的值为 boolean类型的值

    解决方案: status_flag * 1 as status_flag 乘以1之后就不会是boolean类型的值了

  2. SQL经常使用的一些词

    sp_helptext: 例:exec sp_helptext proc_name(查看存储过程的定义) sp_rename: 例:exec sp_rename 'proc_name1','proc_ ...

  3. js的以及前端框架

    js定义:浏览器的脚本语言,用简单的语言实现浏览器的操控 基础语法:基础的运算.函数.对象(原型链.对象构造.class) 所有的框架都是基于原生的js来进行的 js的事件:什么时候.什么情况下处理的 ...

  4. WINDOWS系统的正确安装-硬盘格式如何选择

    有一种这样的说法,WIN7改装WIN10必须要重新分区,将硬盘格式化为GPT格式(GUID分区表 ), WIN10改装WIN7必须要重新分区,将硬盘格式化为MBR格式. 这种说法一直困扰着我,于是经过 ...

  5. doc 常用命令

    ★ 查看java环境变量 echo %JAVA_HOME% echo %PATH% echo %CLASSPATH%

  6. 【BZOJ1305】【CQOI2009】 dance跳舞

    看menci的博客点出二分的思路然后做出来,menci太强辣 原题: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. ...

  7. gunicorn工作原理

    gunicorn工作原理 Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork ...

  8. python查看及修改当前的工作路径

    在pycharm中使用jupyter的时候,有时候需要查看当前的工作路径,然后需要修改当前的路径. 获取当前工作目录 os.getcwd() #用以获取当前的工作目录 改变当前工作目录 os.chdi ...

  9. Unity 5 Game Optimization (Chris Dickinson 著)

    1. Detecting Performance Issues 2. Scripting Strategies 3. The Benefits of Batching 4. Kickstart You ...

  10. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...