题意:定义一个串是k-happy的:对于所有的Ai,都有Aj(j!=i),使得|Ai-Aj|<=k。

问使得原串至少存在一个长度>=m的连续子串是k-happy的最小的k?

标程:

 #include<bits/stdc++.h>
using namespace std;
const int Max=1e7;
const int N=;
int rg[N],lf[N],a[N],n,m,l,r,ans,res,bit[N],L,R,b[N];
int lowbit(int x){return x&(-x);}
void add(int x,int y){while (x<=n) bit[x]+=y,x+=lowbit(x);}
int qry(int x){int res=;while (x) res+=bit[x],x-=lowbit(x);return res;}
int find(int x)//bit二分找rank(x)
{
int l=,r;
for (int i=;i>=&&x;i--)
if ((r=l+(<<i))<=n&&bit[r]<x) x-=bit[l=r];
return l+;
}
bool cmp(int x,int y){return a[x]<a[y];}
void init(int k)
{
L=;R=;
for (int i=;i<=n;i++)
{
while (R<=n&&a[b[R]]<=a[b[i]]+k) add(b[R++],);
while (L<=n&&a[b[L]]<a[b[i]]-k) add(b[L++],-);
int t=qry(b[i]),sum=qry(n);
lf[b[i]]=t==?:find(t-);rg[b[i]]=t==sum?n+:find(t+);
}
while (L<=n) add(b[L++],-);
}
void solve(int l,int r)
{
if (r-l+<m||res>=m) return;
int L=l,R=r,pos=;
while (L<=R)
{
if (lf[L]<l&&rg[L]>r) {pos=L;break;}
if (lf[R]<l&&rg[R]>r) {pos=R;break;}
L++;R--;
}
if (!pos) res=max(res,r-l+);
solve(l,pos-);solve(pos+,r);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&a[i]),b[i]=i;
sort(b+,b+n+,cmp);
l=;r=1e7;
while (l<=r)
{
int mid=(l+r)>>;res=;
if (init(mid),solve(,n),res>=m) ans=mid,r=mid-;else l=mid+;
}
printf("%d\n",ans);
return ;
}

题解:二分答案+启发式分治+树状数组二分

一开始读错题,以为是排序后两边的差都要满足,我写set+二分答案然后发现是假算法。。。

没想到可以把不合法的点拎出来分割开序列。

首先二分一个答案k,然后用权值线段树(但是常数较大)/树状数组可以预处理出[a[i]-k,a[i]+k]范围内离i最近(在左的和在右的)的点,连边。权值线段树是按照位置顺次一个一个加入,求权值范围内的区间最小值/最大值,正反都做一遍。树状数组是按照权值排序后双指针在树状数组上按位置维护权值范围内所有点,然后(类似普通平衡树)求前驱后继。

然后每次在序列中找一个左右连边点都在区间外的点,这个点一个不能选,由此删去这个点,把序列分成两部分。

如果顺次找,每次都找到的最后一个时间复杂度为O(n^2logn)。而每次从两边找,T(n)=T(a)+T(n-a)+min(a,n-a),这样就是启发式合并的复杂度,O(nlog^2n)。

还有一种做法,从后往前枚举左端点,运用字符串的思想统计前缀的答案。用线段树维护后驱覆盖(右开区间),如果新加入的一个点和后面的比它大的点x、比它小的点y匹配上(定义为上述的可以连边),如果这两个点没有前驱匹配,那么需要删除该点的后驱覆盖,和新加入点连边。若m个以后的位置还存在一个点没有被覆盖(值为0),那么取这个点为右端点则符合要求。(区间最小值)。常数较大。

soj116 快乐串的更多相关文章

  1. 大数据量下,分页的解决办法,bubuko.com分享,快乐人生

    大数据量,比如10万以上的数据,数据库在5G以上,单表5G以上等.大数据分页时需要考虑的问题更多. 比如信息表,单表数据100W以上. 分页如果在1秒以上,在页面上的体验将是很糟糕的. 优化思路: 1 ...

  2. 【EF 2】浅谈ADO数据模型生成串(二):数据库连接串分析

    导读:上篇博客中介绍了ADO生成串的前一部分,本篇博客结合报错,接着介绍剩下的部分. 一.代码展示 <span style="font-family:KaiTi_GB2312;font ...

  3. 【洛谷】P1032 字串变换

    题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...

  4. 劳动节快乐!手写个核心价值观编码工具 - Python实现

    前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将 ...

  5. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  6. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  7. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密

    系列目录 前言: 这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明 ...

  9. C#-正则,常用几种数据解析-端午快乐

    在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...

随机推荐

  1. idea springboot 打包 war

    1.pom文件中将项目改为   war

  2. 2019-3-15-在-Windows-Defender-设置文件夹白名单提升-VisualStudio-编译速度

    title author date CreateTime categories 在 Windows Defender 设置文件夹白名单提升 VisualStudio 编译速度 lindexi 2019 ...

  3. Unicode - 16 位统一超级字符集

    描述 (DESCRIPTION) 国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 包含所有别的字符集标准里的字符,并且保证了 ...

  4. mybatis自动生成代码工具(逆向工程)

    MyBatis自动生成实体类(逆向工程) MyBatis属于一种半自动的ORM框架,它需要我们自己编写sql语句和映射文件,但是编写映射文件和sql语句很容易出错,所以mybatis官方提供了Gene ...

  5. windows 远程登录

    在我的电脑  属性当中开启远程登录功能 然后制作账号,这里对于账号的命名是有要求的,具体网上查找说是要用户名和全名一样,我没有做测试,不过新创建了一个用户用来登录,总是告知我密码错误,导致登录失败,所 ...

  6. ES6模块化使用遇到的问题

    前言 最近在学习ES6模块化时,遇到了一些问题,通过查询相关资料得以解决,本篇随笔详细记录了解决方法. 具体内容 以下定义一个模块common.js 在test.html中引入上述定义的模块 运行上述 ...

  7. java.sql.Date和java.util.Date的联系和区别

    1) java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值.毫秒值表示自 1970 年 1 月 1 日 0 ...

  8. gitj基础2

    回滚版本        git reset --hard HEAD^  回滚上一个版本  git reset --hard 版本号(或者版本号前6位)  回滚到指定版本      如果修改版本了,也关 ...

  9. jQuery实现全选与全部选

    为了便于用户理解,直接粘贴下面的代码即可 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  10. vue中使用axios与axios的请求响应拦截

    VUE中使用Axios axios的安装 npm install axios vue-axios axios在vue的配置与使用 在main.js中引入axios和vue-axios import a ...