题目大意:
  给定一个长度为$n(n\le10^5)$的数列$A(A_i\le10^9)$,求最小的$k$满足存在一个长度至少为$m(m\le n)$的子串,对于串中的每一个数$A_i$,都至少存在一个$A_j(i\ne j)$满足$|A_i-A_j|<k$。

思路:
  二分答案$k$,对于每次求出每个元素$A_i$左边离$A_i$最近的满足$|A_i-A_j|<k$的$left[i]=j$,同理求出每个元素$A_j$右边离$A_i$最近的满足$|A_i-A_j|<k$的$right[i]=j$。
  考虑分治,判断区间$[l,r]$是否是满足条件的字串。
  若$r-l+1<m$则显然不满足条件。
  在$[l,r]$中找到一个下标$p$满足$left[p]<l$且$right[p]>r$,则若这样的$p$存在,则包含$p$的区间一定不满足条件,递归处理$[l,p)$和$(p,r]$。若找不到这样的$p$,则该区间满足条件,$k$为合法的答案。
  寻找$p$时,如果不是直接for而是从两端同时往里寻找,设找到的$p$两端的区间长度分别是$a$和$b$,则递归的复杂度是$O(n\log n)$(递推式$T(n)=T(a)+T(b)+\min(a,b)$)。而$left$和$right$的预处理可以用线段树实现,总的时间复杂度是$O(n\log^2 n)$。

 #include<vector>
#include<cstdio>
#include<climits>
#include<algorithm>
class FindingFriends {
private:
using int64=long long;
static constexpr int N=1e5+;
int n,m,lim,arr[N],tmp[N],left[N],right[N];
class SegmentTree {
#define _left <<1
#define _right <<1|1
private:
int max[N<<],min[N<<];
void push_up(const int &p) {
max[p]=std::max(max[p _left],max[p _right]);
min[p]=std::min(min[p _left],min[p _right]);
}
public:
void reset() {
std::fill(&max[],&max[N<<],INT_MIN);
std::fill(&min[],&min[N<<],INT_MAX);
}
void modify(const int &p,const int &b,const int &e,const int &x,const int &y) {
if(b==e) {
max[p]=std::max(max[p],y);
min[p]=std::min(min[p],y);
return;
}
const int mid=(b+e)>>;
if(x<=mid) modify(p _left,b,mid,x,y);
if(x>mid) modify(p _right,mid+,e,x,y);
push_up(p);
}
int qmax(const int &p,const int &b,const int &e,const int &l,const int &r) {
if(b==l&&e==r) return max[p];
const int mid=(b+e)>>;
int ret=INT_MIN;
if(l<=mid) ret=std::max(ret,qmax(p _left,b,mid,l,std::min(mid,r)));
if(r>mid) ret=std::max(ret,qmax(p _right,mid+,e,std::max(mid+,l),r));
return ret;
}
int qmin(const int &p,const int &b,const int &e,const int &l,const int &r) {
if(b==l&&e==r) return min[p];
const int mid=(b+e)>>;
int ret=INT_MAX;
if(l<=mid) ret=std::min(ret,qmin(p _left,b,mid,l,std::min(mid,r)));
if(r>mid) ret=std::min(ret,qmin(p _right,mid+,e,std::max(mid+,l),r));
return ret;
}
#undef _left
#undef _right
};
SegmentTree t;
bool check(const int &l,const int &r) {
if(r-l+<m) return false;
int pos=-;
for(register int i=;l+i<=r-i;i++) {
if(left[l+i]<l&&right[l+i]>r) {
pos=l+i;
break;
}
if(left[r-i]<l&&right[r-i]>r) {
pos=r-i;
break;
}
}
return pos==-||check(l,pos-)||check(pos+,r);
}
int getlow(const int &x) const {
return std::upper_bound(&tmp[],&tmp[tmp[]]+,x-)-tmp;
}
int getup(const int &x) const {
return std::lower_bound(&tmp[],&tmp[tmp[]]+,x+)--tmp;
}
bool check(const int &k) {
t.reset();
for(register int i=;i<=n;i++) {
left[i]=t.qmax(,,tmp[],std::max(getlow(tmp[arr[i]]-k),),std::min(getup(tmp[arr[i]]+k),tmp[]));
t.modify(,,tmp[],arr[i],i);
}
t.reset();
for(register int i=n;i>=;i--) {
right[i]=t.qmin(,,tmp[],std::max(getlow(tmp[arr[i]]-k),),std::min(getup(tmp[arr[i]]+k),tmp[]));
t.modify(,,tmp[],arr[i],i);
}
return check(,n);
}
public:
int shortestDistance(const int &nn,const std::vector<int> &init,const int &a,const int &b,const int &c,const int &d,const int &mm) {
n=nn,m=mm;
for(register unsigned i=;i<init.size();i++) arr[i+]=init[i];
for(register int i=init.size();i<n;i++) {
arr[i+]=(((int64)arr[i]*a%d+(int64)b*i%d)%d+c)%d;
}
lim=*std::max_element(&arr[],&arr[n]+);
std::copy(&arr[],&arr[n]+,&tmp[]);
std::sort(&tmp[],&tmp[n]+);
tmp[]=std::unique(&tmp[],&tmp[n]+)-&tmp[];
for(register int i=;i<=n;i++) {
arr[i]=std::lower_bound(&tmp[],&tmp[tmp[]]+,arr[i])-tmp;
}
int l=,r=lim;
while(l<=r) {
const int mid=(l+r)/;
if(check(mid)) {
r=mid-;
} else {
l=mid+;
}
}
return r+;
}
};

[TC-FindingFriends]Finding Friends的更多相关文章

  1. POJ_3740 Easy Finding ——精确覆盖问题,DLX模版

    Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18790   Accepted: 5184 Des ...

  2. hdu-5992 Finding Hotels(kd-tree)

    题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 102400/102400 K (Java/ ...

  3. H TC並沒有成為下一個摩托羅拉或諾基亞。

    關於2014年第四季度,H T C在三季度財報說明中提到,“年度旗艦H T CO ne(M 8)與中端機型H T C D esire系列在競爭日趨激烈的智能手機市場保持穩定的銷售,市占率有所提升,延續 ...

  4. [转] Finding the Best Programmer's Font

    原文 Finding the Best Programmer's Font

  5. TC(Total Commander)文件管理神器

    TC文件管理神器 Total Commander是一个会显著提高文件操作效率的工具,而文件操作是应用计算机最基本的功夫,也是伴随一生的操作.因此花一点时间学习,而会受益一世. Total Comman ...

  6. Linux TC基于CBQ队列的流量管理范例

    参考了TC的很多文档,自己也整理了一篇配置记录.在实际使用过程中效果还不错,在此分享给大家以备参考.环境:局域网规模不是很大40多台机器. NAT共享上网(内网:eth0 外网:eth2)CBQ是通过 ...

  7. Linux TC流量控制HOWTO中文版

    <本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...

  8. LOJ Finding LCM(math)

    1215 - Finding LCM Time Limit: 2 second(s) Memory Limit: 32 MB LCM is an abbreviation used for Least ...

  9. 蒟蒻修养之tc蓝名计划

    开一个新坑......(听说tc是智商高的人才能玩的QAQ显然我是被屠的... 1 [645DIV2]这个能说是裸模拟吗... 弃坑= =做了一些题感觉没必要放上来了= =等div1先吧....... ...

  10. 验证码识别 edge enhancement - 轮廓增强 region finding - 区域查找

    Computer Science An Overview _J. Glenn Brookshear _11th Edition The task of understanding general im ...

随机推荐

  1. HLPP

    LOJ 最大流加强版 #include <bits/stdc++.h> const int inf=0x7fffffff; const int maxn=1210; const int m ...

  2. mysql_存储过程和函数

    存储过程和函数 1.什么是存储过程和函数 存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对 ...

  3. jw player学习笔记

    一.是否支持IE7/8 本地离线播放不支持IE7/8,部署在服务器上时可以. 本地播放报错示意图 二.如何去Logo 1.网页版--HTML5---破解 桌面浏览器看到的效果: jwplayer(&q ...

  4. checkbox和后面文字无法居中对齐的解决方案

    制作前端页面时,表单的页面中都存在表单元素与提示文字无法对齐的问题.下面是针对这一问题的解决方案: 先上结果图看效果,吼吼~ 最上面两个是经过css处理后的效果,已经居中对齐了哦~,最后一个是没有处理 ...

  5. python 读 excel 模块: xlrd

    主要来自:[ python中使用xlrd.xlwt操作excel表格详解 ] 为了方便阅读, 我将原文两个模块拆分为两篇博文: [ python 读 excel 模块: xlrd ] [ python ...

  6. python用户登录,密码错误3次则锁定

    需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3.判断 ...

  7. Linux编写Shell脚本

    ——<Linux就该这么学>笔记Shell脚本命令的工作方式有两种 交互式: 用户每输入一条命令就立即执行 批处理: 由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中 ...

  8. 我们应选择怎样的IT公司

    最近经常有朋友提问,同时收到几家公司的offer,应该如何选择,或者找工作的时候,找怎样的公司,我在这里阐述一下我的观点.但愿对朋友们有所帮助. 还是那句老话,选择什么样的公司,关键是你想要过什么样的 ...

  9. 杀掉TOMCAT并重启的脚本

    /usr/local/tomcat7/bin/shutdown.sh sleep #具体时间就看你得webapp在调用shutdown.sh后多久后处于僵死状态 ps -ef | grep sleep ...

  10. JAVA的线程学习、并发线程的学习

    http://blog.csdn.net/column/details/multithreading.html http://blog.csdn.net/fhd001/article/details/ ...