bzoj 4059: [Cerc2012]Non-boring sequences

题意

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

题解

首先,一个很显然的做法就是
对于每一个位置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 ) + m i n ( k , n − k ) T(n)=T(k)+T(n-k)+min(k,n-k) T(n)=T(k)+T(nk)+min(k,nk)
容易发现,这东西就是启发式合并,因此复杂度也是 n l o g n nlogn nlogn
无论从代码上还是从常数上都比第一个做法小得多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值