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

分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. C语言--第六周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...

  2. manjaro运行virtualbox报错

    manjaro运行virtualbox报错manjaro使用添加删除程序搜索virtualbox安装后运行报错, 安装过程有选择modules的过程(这里要选择匹配当前系统内核的版本),当时不了解是干 ...

  3. doubleclick video notes

    1,vast duration it must math this format ,if use “00:00:7 ”  it will tip “ ” <Duration>00:00:0 ...

  4. Android命令行工具学习总结

    15.setting命令 setting命令可以很方便的更改系统设置中的参数(如修改系统默认输入法) 安卓Settings模块浅析:https://www.jianshu.com/p/ed8508fe ...

  5. skipper 内置的常用filters

    skipper 的filter 功能很强大,可做好多方便的扩展 格式: all: * -> filter1 -> filter2 -> "http://127.0.0.1: ...

  6. c/c++编译和链接过程

    编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表. 未解决符号表提供了所有在该编译单元里引用但是定义并 ...

  7. MINA线程模型

    一.三种工作线程: (一) Acceptor  thread: 该线程的作用是接收客户端的连接,并将客户端的连接导入到IOProcessor线程模型中.Acceptor thread在调用了Accep ...

  8. PCA原理解释

      上图讲述的两组数据,可以看到左图的数据离散度比较大,相关性比较弱,右图数据的相关性比较强:我们在使用PCA的时候,就是要将相关性强的数据进行降维,以减少处理的数据量. 那么怎么描述数据的相关性呢? ...

  9. Redis sortedset有效集合数据结构

    1. 增加一个有效集合 2. 查看元素个数 3. zscore 4. zcount 5. 返回指定元素的索引 zrank 6.zincrby 给元素a加90分 7. zrange查看范围

  10. PL/SQL Developer显示中文乱码

    PL/SQL Developer显示中文乱码,可能是oracle客户端和服务器端的编码方式不一样. 解决方法: Select userenv('language') from dual; 设置环境变量 ...