bzoj 4059: [Cerc2012]Non-boring sequences

探讨如何高效判断一个整数序列是否为不无聊序列,即每个连续子序列中是否存在一个独一无二的数字。通过递归分解和启发式合并策略,实现nlogn的复杂度优化。

题意

一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。

题解

首先,一个很显然的做法就是
对于每一个位置i,我们可以知道他作为独一无二的值的区间有什么
这个预处理上一个,下一个和他一样的就可以了
然后就相当于这一段区间都是合法的
如果[l,r]看作一个点,明显地,他可以覆盖一个矩形
那么就变成矩形面积并了
看一下是否覆盖所有合法区间即可

但是这样做这题就太没有意思了。。

于是就有一个很好玩的做法
就是对于一个区间[l,r][l,r][l,r]
如果他的一个位置p,是独一无二的,那么我们显然可以递归[l,p−1],[p+1,r][l,p-1],[p+1,r][l,p1],[p+1,r]
至于p怎么找,你可以从序列的两头扫两个指针
如果有一个符合就结束递归
复杂度的话,你会发现,形式是这样的T(n)=T(k)+T(n−k)+min(k,n−k)T(n)=T(k)+T(n-k)+min(k,n-k)T(n)=T(k)+T(nk)+min(k,nk)
容易发现,这东西就是启发式合并,因此复杂度也是nlognnlognnlogn
无论从代码上还是从常数上都比第一个做法小得多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值