Codeforces1270H Number of Components

观察发现,如果 i , j ( i < j ) i,j(i<j) i,j(i<j)连通,那么对于任意的 k ∈ ( i , j ) k\in (i,j) k(i,j) k k k i , j i,j i,j连通。

证明:考虑连通块中从 i i i j j j的一条路径,若 k k k在这条路径上结论显然成立;否则,这其中必定存在一条边 ( u , v ) (u,v) (u,v)满足 u < k < v u < k < v u<k<v,由于 a u < a v a_u < a_v au<av,所以 a u < a k ∨ a k < a v a_u < a_k \vee a_k< a_v au<akak<av一定成立。

所以,连通块一定是序列上的一段连续的区间。

将问题转化成:计算有多少个 p p p,满足 [ 1 , p ] [1,p] [1,p] [ p + 1 , n ] [p+1,n] [p+1,n]之间没有边。而这个限制条件也等价于 ∀ x ∈ [ 1 , p ] , y ∈ [ p + 1 , n ] , a x > a y \forall x\in [1,p], y\in [p+1,n], a_x > a_y x[1,p],y[p+1,n],ax>ay

考虑枚举 [ p + 1 , n ] [p+1,n] [p+1,n]中的最大值 v v v,记序列中小于等于 v v v的值为 0 0 0,大于 v v v的值为 1 1 1,则 p p p合法的条件就是整个序列形如 111 ⋯ 111 ⏞ p个1 000 ⋯ 000 \overbrace{111\cdots 111}^{\text{p个1}}000\cdots 000 111111 p1000000

发现对于每个 v v v而言,它对应的 01 01 01序列是确定的,也就是说尽管一个 v v v可以对应多个 p p p,但是这些 p p p中至多只有一个合法。

所以我们不妨直接统计有多少个 v v v对应的 01 01 01序列形如 111 ⋯ 111000 ⋯ 000 111\cdots 111000\cdots 000 111111000000

为了方便处理,我们令 a 0 = + ∞ , a n + 1 = − ∞ a_0 = + \infty, a_{n+1} = -\infty a0=+,an+1=

用线段树维护对每一个 v v v维护它对应的 01 01 01序列中相邻的 10 10 10对的数量,以及 v v v是否作为序列中的某个元素出现。由于 10 10 10对的数量至少有一个,所以维护最小值以及最小值的数量,即可得到合法的 v v v的数量。

Code

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值