题意:定义一个串是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. CSS3:FlexBox的详解

    Flexbox是Flexible box 的简称(灵活的盒子容器),是CSS3引入的新的布局模式.它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来. 它之所以被称为 Fl ...

  2. 6.2_springboot2.x分布式整合Dubbo

    1.分布式应用 ​ 在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud. 分布式系统: 特 ...

  3. Selenium3 + Python3自动化测试系列七——多窗口切换

    多窗口切换 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作. WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切 ...

  4. BigDecimal的操作工具类

    import java.math.BigDecimal; /** * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类 * @author ameyume * */ public cla ...

  5. PL/SQL Developer 查看查询的执行计划

    https://zhuanlan.zhihu.com/p/65771352 通过 PL/SQL Developer 查看查询的执行计划 1 什么是执行计划 执行计划是一条查询语句在 Oracle 中的 ...

  6. Ubuntu桌面突然卡住,图形界面无反应

    1.可能等待几分钟,系统会自动反应过来.你可以选择等待几分钟. 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户. (1)Ubuntu有6个tty终端,按住Ctrl+Alt+ ...

  7. 3年A班,从现在起大家都是人质-观后感

    花了2天时间观看了由小室直子.铃木勇马.水野格导演,武藤将吾编剧的3年A班日剧. 这部剧我觉得很擅长用对比的手法,将一个受欢迎的老师人前人后强烈对比,一群外表成熟,内心却始终还是孩子气的学生对比,也将 ...

  8. Java——对象

    1.2对象 1.2.1 对象的创建和使用 ①使用new + 构造器创建一个新的对象: ②使用“对象名.对象成员”的方式访问对象成员(包括属性和方法). public class Animal { pu ...

  9. 【磁盘】顺序IO比随机IO快

    假设磁盘每秒可以做100个随机I/O操作,并且可以完成每秒10MB的顺序读取(这大概是消费级磁盘现在能达到的水平).如果每行100字节,随机读每秒可以读100行(相当于每秒10000字节=10KB), ...

  10. CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路

    摘要: 关于 Kubernetes 接口化设计.CRI.容器运行时.shimv2.RuntimeClass 等关键技术特性的设计与实现.     Kubernetes 项目目前的重点发展方向,是为开发 ...