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

分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. Logo的制作

    <style> header { width: 1300px; height: 100px; /* background-color: pink; */ margin: 0 auto; p ...

  2. POJ3090 Visible Lattice Points (数论:欧拉函数模板)

    题目链接:传送门 思路: 所有gcd(x, y) = 1的数对都满足题意,然后还有(1, 0) 和 (0, 1). #include <iostream> #include <cst ...

  3. c# 敏捷3 连接,批量处理,分页

    class Program { public class post { public int id { get; set; } public string name { get; set; } pub ...

  4. 【SpringCloud】初识springCloud

    转载来源:https://maimai.cn/article/detail?fid=1149221357&efid=lL_Z3WzTyUDLAjQwrNrIsw 概述 毫无疑问,Spring ...

  5. LG4071 [SDOI2016]排列计数

    题意 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 ...

  6. Redis源码剖析和注释(七)--- 快速列表(quicklist)

    Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现. 通过列表键查看一下:redis 列表键命令详解 127.0. ...

  7. 03关于C的数组指针

    一.数组与指针有什么关系 (1)地址 数组名就是一个地址,指向一个数组的开端. 从实验结果我们可以看出前三个地址都是一样的,都是数组的开始地址,而最后一个是数组的第二个元素,因为是整型数据,地址加4. ...

  8. APACHE REWRITE ? 匹配问号的写法

    RewriteRule 不会去匹配 ? 后面的字符串,需要用RewriteCond来匹配 把 /abc?id=123  =>  /def.php?id=123 的写法:   RewriteEng ...

  9. Openfire源码阅读(一)

    本篇先分析openfire源码的主要流程,模块细节后续再继续分析: 一.简介: Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMP ...

  10. What is the difference between concurrency, parallelism and asynchronous methods?

    Ref: http://stackoverflow.com/questions/4844637/what-is-the-difference-between-concurrency-paralleli ...