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文档,此处不具体说明,谢谢. 开始吧 ...
随机推荐
- 39-Ubuntu-用户管理-04-usermod设置主组和附加组
主组:通常在新建用户时指定,在/etc/passwd的第4列GID显示主组名. 附加组:在/etc/group中最后一列显示该组的用户列表,用于指定用户的附加权限. 1.修改用户的主组 sudo us ...
- 【Codeforces】450 B(div2)
题目链接:http://codeforces.com/problemset/problem/450/B 题意: 求这个的第n项. 题解:$f_{i+1} = f_i - f_{i-1} $ \begi ...
- Reqests----Get请求之参数化
一.环境安装 >>pip install requests 注意:pip很容易就会版本升级,如果用python3的,请使用pip3 install requests 1.初始化版本 2.把 ...
- Linux文件介绍
Linux文件介绍 Linux 文件属性 可以通过命令ll+文件名,查看文件的具体属性 例如:ll syz.gz 1736706 -rw-r--r--. 1 root root 28 Oct 27 1 ...
- bootstrap-自带插件(完成的小功能)
模态框 务必将模态框的HTML代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组件影响模态框的展现和/或功能. <!-- 触发模态框的按钮 --> & ...
- tomcat+apache+jk
安装JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html安装 rpm ...
- Android SDK 环境变量配置
ANDROID_HOME = D:\Package\android-sdk-windows 在path 中加入 %ANDROID_HOME%\tools 和 %ANDROID_HOME%\platfo ...
- 树上莫比乌斯反演+分层图并查集——cf990G
/* 树上莫比乌斯反演 求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d) 如何求: 建立200000层新图,即对于每个数建立一个新图 在加边时,给gcd(au,av)的约数层 ...
- 在DELPHI中显示GIF动画
想没想过在DELPHI中显示GIF动画?Delphi的用户是非常幸运的,因为有免费控件可以使用.最著名的控件是Anders Melander编写的TGifImage,并提供完整的源程序.它原来的主页是 ...
- NX二次开发-UFUN输出UF函数使用错误UF_get_fail_message
#include <uf.h> #include <uf_ui.h> #include <uf_modl.h> UF_initialize(); UF_FEATUR ...