0%

【杂题】7,8月杂题选做

图论相关

题目来源

ABC308Ex

题意

给定一张 \(n\) 个点 \(m\) 条边的无向带权图,找到图中一个权值最小的 \(\text{Q}\)

\(\text{Q}\) 定义为一个环带上一条与这个环相连且不在环上的边。

\(4\le n \le 300 , 4\le m \le \frac{n(n-1)}{2}\)

思路

考虑枚举每一条边作为 \(\text{Q}\) 的尾巴,然后把这条边删去,从这条边的一个端点跑一个单源最短路。然后再枚举两个点,能够轻松找到不经过这条边的一个最小环。

这样枚举尾巴的时间复杂度为 \(O(n^2)\) ,找最小环的时间复杂度为 \(O(n^2)\) ,总时间复杂度为 \(O(n^4)\) ,这是难以接受的。

考虑到一个环会占用一个点相连的两条边,最劣情况下尾巴也是第三小的边,所以我们第一步不需要枚举所有的边作为尾巴,只需要枚举每个点相连的前三小的边做尾巴即可。这样枚举尾巴的时间复杂度降为 \(O(n)\) ,总时间复杂度降为 \(O(n^3)\)

动态规划

题目来源

CF626F

题意

给定一个长度为 \(n\) 的数列 \(a\) ,把 \(a\) 分成任意组,每组的不和谐度定义为该组内元组的最大值与最小值之差,求所有不和谐度之和不超过 \(m\) 的分组方案数,对 \(10^9 + 7\) 取模。

\(1 \le n \le 200 , 0 \le m \le 10^3 , 1 \le a_i \le 500\)

思路

由于不和谐度是最大值与最小值的差,乱找不好找,考虑对数列 \(a\) 从小到大进行排序,然后依次考虑每个数的分组情况。

考虑设 \(f_{i,j,k}\) 为选了前 \(i\) 个位置,有 \(j\) 个没有结束的组,当前选的总不和谐度为 \(k\) 的方案数。

考虑若有一个组选了 \(a_{p_1} , a_{p_2} , \cdots, a_{p_n}\) 这些元素,且 \(p_1 < p_2 < \cdots < p_n\) ,则不和谐度为 \(a_{p_n} - a_{p_1}\)

考虑到 \(a_{p_n} - a_{p_1} = (a_{p_n} - a_{p_{n-1}}) + (a_{p_{n-1}} - a_{p_{n-2}}) + \cdots + (a_{p_2} - a_{p_1})\) ,所以每次向之前的某一组中加入 \(a_{i + 1}\) 这个元素时,所有的组都会被增加 \(a_{i + 1} - a_{i}\) 的不和谐度,利用这个可以找到转移时 \(k\) 的增量。

再考虑转移的几种情况:

  • 当前点单独成组:\(f_{i + 1 , j , k + j \times (a_{i + 1} - a_i)} \leftarrow f_{i,j,k}\)

  • 当前点加入一个组中,即不作为最大值,也不作为最小值:\(f_{i + 1, j, k + j \times (a_{i+1} - a_{i})} \leftarrow f_{i, j, k}\)

  • 当前点新开一个组,且作为最小值:\(f_{i + 1, j + 1 , k + j \times(a_{i + 1} - a_{i})} \leftarrow f_{i,j,k}\)

  • 当前点结束一个组,且作为最大值:\(f_{i + 1, j - 1, k + j \times (a_{i+1}-a_{i})} \leftarrow f_{i,j,k}\)

复杂度可以做到 \(O(n^2 m)\)

题目来源

acjudge#773

题意

\(n\) 个物品和四个盒子 \(A,B,C,D\) ,每个物品都有一个重量 \(w_i\) ,你需要将每个物品放入一个盒子中。

给定 \(k_1,k_2,k_3,k_4\) ,设 \(|X|\) 表示 \(X\) 盒子内物品的总重,一个合法的装盒方案最终应当满足如下的条件:

\[ |A|+|B|\le k_1 \]

\[ |C|+|D|\le k_2 \]

\[ |A|+|C|\le k_3 \]

\[ |B|+|D|\le k_4 \]

求有多少种合法的装盒方案,答案对 \(998244353\) 取模。

\(1\le n \le 100 , 1 \le k_i \le 1000\)

思路

脑筋慢转弯题(bushi

最直接的思路就是一个四维的背包 \(\text{dp}\) ,设 \(f_{i,a,b,c,d}\) 表示前 \(i\) 件物品,\(A\)\(B\) 总共放了 \(a\)\(C\)\(D\) 总共放了 \(b\)\(A\)\(C\) 总共放了 \(c\)\(B\)\(D\) 总共放了 \(d\) ,满足以上限制的总方案数。转移就考虑当前物品放入哪一个箱子。

发现四个盒子两两组合总共有 \(6\) 种,但题目中只限制了 \(4\) 种,于是找一下关系,不难发现前两个式子加起来是 \(|A| + |B| + |C| + |D|\) ,后两个式子加起来也是 \(|A| + |B| + |C| + |D|\)

\(w_i\) 的前缀和是 \(sum_i\) ,那么到第 \(i\) 个位置,由于每个物品一定会被放入四个盒子其中之一,所以 \(a + c = |A| + |B| + |C| + |D| = sum_i\)\(b + d = |A| + |B| + |C| + |D| = sum_i\) ,所以我们找到了 \(a,c\) 之间和 \(b,d\) 之间的关系,这样可以压掉两维,时间复杂度变成了 \(O(n k ^2)\)