soj116 快乐串
题意:定义一个串是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 快乐串的更多相关文章
- 大数据量下,分页的解决办法,bubuko.com分享,快乐人生
大数据量,比如10万以上的数据,数据库在5G以上,单表5G以上等.大数据分页时需要考虑的问题更多. 比如信息表,单表数据100W以上. 分页如果在1秒以上,在页面上的体验将是很糟糕的. 优化思路: 1 ...
- 【EF 2】浅谈ADO数据模型生成串(二):数据库连接串分析
导读:上篇博客中介绍了ADO生成串的前一部分,本篇博客结合报错,接着介绍剩下的部分. 一.代码展示 <span style="font-family:KaiTi_GB2312;font ...
- 【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...
- 劳动节快乐!手写个核心价值观编码工具 - Python实现
前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将 ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
系列目录 前言: 这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明 ...
- C#-正则,常用几种数据解析-端午快乐
在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...
随机推荐
- SDL系列之 - 字体显示测试
例9.7:设计一个程序,初始化视频子系统,设置显示模式为640*480,表面的色深为16位,使用SDL_ttf库在屏幕上显示“Linux下TrueType字体显示示例”,字体大小为38,颜色为红色.设 ...
- D3.js(v3)+react 制作 一个带坐标与比例尺的散点图 (V3版本)
上一章做了柱形图,https://www.cnblogs.com/littleSpill/p/10835041.html 这一章做散点图. 散点图(Scatter Chart),通常是一横一竖 ...
- Vue双向数据绑定原理深度解析
首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...
- Eureka备忘
一. 二. 2.2. eureka集群同步集群相关重要的类com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl: 为了保证集群里所有Eur ...
- MonkeyTalk使用方法
1.简单介绍 MonkeyTalk软件测试工具由两部分构成:MonkeyTalk IDE 和 MonkeyTalk Agents MonkeyTalk IDE是Eclipse平台的工具,工能是:对iO ...
- 七牛云-C#SDK-上传-前期准备
1.创建一个asp.net core MVC 程序(这里随便) 这是一个空的程序 2.创建UploadController 3.添加引用 Install-Package Newtonsoft.Json ...
- Delphi 中多线程同步的一些处理方法
Delphi 中多线程同步的一些处理方法 当创建了多个线程,并且多个线程都要访问同一资源,,就有可能出现混乱,于是用Synchronize来控制,使同一时间只有一个线程使用那部分资源,Synchr ...
- cnn知识点汇总
关于卷积神经网络的入门基础知识: https://blog.csdn.net/weixin_42451919/article/details/81381294 卷积神经网络的相关公式推导: htt ...
- NX二次开发-对话框加锁UF_UI_lock_ug_access
VC/MFC调用UG Dialog要进入加锁状态 加锁 UF_UI_lock_ug_access ( UF_UI_FROM_CUSTOM ); 此处为UF_UI_select的函数 解锁 UF_UI_ ...
- Python sorted list的实现
Python sorted list的实现 具体思路是用二分保list有序+插入 class SortedList(list): K = -1 def __init__(self, K=-1): li ...