20230712 学习笔记

Meet \ in \ the \ Middle

复杂度: O(k^{\frac{n}{2}})

适用范围:

1 数据很小,但不是特别小
2 答案需要支持合并

eg1 : 求在 n 个数中选取若干个数使其和为 m 的方案数(n \le 40)

solve :

把所有的数分成两半
先枚举前 \frac{n}{2} 个数中所以选择方案,将可能的值存入哈希表

再枚举后 \frac{n}{2} 个数中所以选择方案,在哈希表中查询和为 m 的方案数

复杂度 O(2^{\frac{n}{2}})

eg2 : 求在 n 个数中选取若干个数使其和为总和的一半的方案数(n \le 23)

每个数可能有三种状态 :

不选 || 选中并分入第一个组 ||选中并分入第二个组

两种方案不同当且仅当他们"不选"状态的数集合不相同

题意可转化为:

为每个数分配权重 {-1,0,1} 之一,使
\sum w_i \times a_i = 0

求可能的 w_i = 0 的集合个数

solve :

左边取 m 个数,暴力枚举复杂度 O(3^m) 对每个 wi = 0 的集合记录其和的方案数
右边剩余 (n - m) 个数,暴力枚举 $w_i$,再枚举与左边哪个集合拼在一起对于每种右边 wi = O 集合与左边某个集合拼在一起和为 0 则对答案产生 1 的贡献
复杂度O$(3^{n-m} \times 2^m)$

eg3 : [NOI2001]方程的解数

eg4 : 给定一张 n 个点 m 条边的图,点权为 0 \ 或 $1$,边权为两端点值的和问有多少种写方案使边权至少有一个 $0 \ $,至少有一个 $1 \ $,至少有一个 2 \ ($n \le 40$,时限 3.5s)

solve :

考虑容斥

f[...] 表示边权取值在 ... 集合内的方案数

那么 ans = f[0, 1, 2] - f[0, 1] - f[1. 2] - f[0, 2] + f[0] + f[1] + f[2]

f[0, 1, 2] :点权任取, 方案数 2^n

f[0] / f[2] : 孤点任取, 其他点 1 或 $2$, 方案数 2^{孤点个数}

f[1] : 每条边连接的一定是一个 0 和一个 1, 即每个连通块都是二分图时, 方案数$2^{连通块个数}$,否则为 0

f[0, 2] :每个连通块点权相同,方案数 2^{连通块个数}

f[1, 2] / f[0, 1]:

考虑 meet\ in\ the\ middle\

f[0, 1] :

如果一个点取值为 $0$,则它相邻的点不受限制如果一个点取值为 $1$,则它相邻的点必定为 0,
将所有点分成两部分, 枚举前一半的点权可能取值,并判断当前状态合法与否(即是否已经产生冲突)

f[1, 2] : 同理

two-pointer

ij 对影响

j移动的方向
j移动的起终点
j移动的快慢

对撞指针

eg1. 求和

给定一个长度为 n 的序列 {a_n} 和 $k$,求序列中有多少对数相加等于 k (n \le 10^5,|ai|,|k| \le 10^9)

solve :

1 sort

2 对撞指针

i 从小到大搜, j 从大到小搜

eg2. Black Hills golden jewels

给出一个长度为 n 的数组,求集合 (ai+aj), i<j 里的第 k 大元素 (n \le 105,k \le \frac{n(n-1)}{2})

solve :

正难则反 ——> 二分答案

但暴力统计 O(n^2)

故考虑双指针,排序,枚举一个 i ,求一个最大的 $j$。随着 i 增大,$j$ 只会不变或减小。 O(n)

滑动窗口

特征: 吞食, 吃撑, 排泄(6

eg1. 给定长度为n的数列和正整数S,求和不小于S的子段的最短长度(n < 1 \times 10^5,1 \le 数列元素,S \le 1 \times 10^9)

eg2. 给定一棵 n 个点的树,点有点权,点权互不相同。给定$q$ 组询问,每组询问给出 $x$,求 x 节点子树内是否存在三个点的点权可以构成三角形( n,q \le 4 \times 10^4,1 \le 点权 \le 10^7)

eg3. 给定一个长度为 n 的序列 {a_n} ,求最长的不包含重复数字的连续子段长度(n \le 1 \times 10^5, a_i < 3 \times 10^5)

快慢指针

小组成员:邵品渊, 邵品砚, 蒋佳成, 顾天泽

1 个赞

%%% 您们是哪个班的

1 个赞

%%%
orz