组合杂题选讲 #1

问题描述

题意:一个长度为 \(n\) 的由 \(-1\)\(1\) 构成的序列 \(a\),其中 \(1\) 的个数为 \(c\) 个。我们称一个子区间合法是指该子区间的数的和大于等于 \(0\)。求证:所有合法子区间的左端点的数量不超过 \(2c\) 个。

提示:子区间是指序列中连续的一段,形式化地说,问题是求证

\[\left|\left\{l:\exists_{r\geq l}\left(\sum_{i=l}^ra_i\right)\geq0\right\}\right|\leq2c \]

举个例子,若 \(n=8,c=3\),序列 \(a\)

\[-1,1,1,-1,-1,1,-1,-1 \]

那么序列 \(a\) 中所有合法子区间的左端点共有 \(5\) 个,为下面括号的位置

\[(-1),(1),(1),-1,(-1),(1),-1,-1 \]

解答

对于某个序列 \(a\),记 \(S(a)\) 表示序列中所有合法子区间的左端点的数量。

如果 \(a\) 存在一个 \(-1\) 在一个 \(1\) 的后面,即存在下标 \(i,j\) 满足 \(i<j\)\(a_i=1,a_j=-1\),那么交换 \(i,j\) 位置上的值后,得到一个新序列 \(a'\),显然 \(a'\)\(1\) 的数量也为 \(c\)

引理 进行上述变换后所有合法子区间的左端点的数量不降,即 \(S(a)\leq S(a')\) 一定成立。

假设上述引理成立,那么我们就只需要论证由 \(n-c\)\(-1\) 开头,然后 \(c\)\(1\) 组成的序列 \(a_0\) 满足 \(S(a_0)\leq 2c\),这是显然的。而对于任何其他序列,它们都可以通过有限次上述变换得到序列 \(a_0\)

下面我们证明该引理成立,考虑序列 \(a\) 的前缀和序列 \(p\)

\[p_k=\sum_{i=1}^ka_i \]

那么左开右闭区间 \((l..r]\) 合法等价于 \(p_r-p_l\geq0\)。设我们要交换序列 \(a\) 中的 \(i,j\) 位置,由于 \(a_i=1\),所以 \(p_{i-1}=p_i-1\) 。若某个位置 \(k<i\) 本来某个合法区间的左端点,而交换 \(i,j\) 位置上的值后它就不是了,那么一定有 \(p_k=p_i\)

那么找出 \(i\) 前面第一个 \(p_k=p_i\) 的位置(如果有)后,\(k\) 以前的左端点都不会改变,因为 \(p_k=p_i\) 说明 \(i,k\) 位置是等价的。这说明 \(S(a)\leq S(a')\)

2022年12月08日 于东莞松山湖

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值