组合杂题选讲 #1

问题描述

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

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

|{l:rl(i=lrai)0}|2c

举个例子,若 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<jai=1,aj=1,那么交换 i,j 位置上的值后,得到一个新序列 a,显然 a1 的数量也为 c

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

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

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

pk=i=1kai

那么左开右闭区间 (l..r] 合法等价于 prpl0。设我们要交换序列 a 中的 i,j 位置,由于 ai=1,所以 pi1=pi1 。若某个位置 k<i 本来某个合法区间的左端点,而交换 i,j 位置上的值后它就不是了,那么一定有 pk=pi

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

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

posted @   方而静  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示