P6846 [CEOI2019] Amusement Park
考虑所有DAG都是一正一反成对出现的,且两者所需的步数和为 m 2 \frac{m}{2} 2m,那么答案就转换为给这个无向图定向的DAG方案数 ∗ m 2 * \frac{m}{2} ∗2m
子集dp即可
O
(
3
n
)
O(3^n)
O(3n)
代码
CF1215E. Marbles
考虑如果是给序列排序的话,最少的次数就是逆序对数,因为交换一次就可以使得逆序对减少一个,没有逆序对的时候就完成了
现在就相当于给这20种颜色赋上不同的值,现在从小到大赋值,记 f s f_s fs表示已经选择了s中为1的颜色了,现在枚举一个为0的位置作为下一个数字,计算带来的贡献
先预处理出来 g s [ i ] [ j ] gs[i][j] gs[i][j]表示颜色 i 和颜色 j 有多少个逆序对
时间复杂度 O ( 20 ∗ n + 2 20 ∗ 20 ∗ 20 ) O(20*n+2^{20}*20*20) O(20∗n+220∗20∗20)
CF840C On the Bench
给每个数除去平方因子,问题转化为求多少个排列满足不存在两个相邻的数相等
我们给序列从小到达排序
经典dp问题,设
f
[
i
]
[
j
]
[
k
]
f[i][j][k]
f[i][j][k]表示前 i 个数填完后,有 j 个相邻数对,与当前数字相等相邻数对有 k 个
这样就分类讨论,是插在两个不相等数中间,还是放在两个和自己相等的数中间,还是放在两个相等的却不等于自己的数中间
代码
UOJ80. 二分图最大权匹配
今天再来复习一下这个带权km的bfs写法,时间复杂度 O ( n 3 ) O(n^3) O(n3)
先求出每个男生最大的期望值,也就是所有可能的女生的最大值
然后开始逐个bfs,每次给slack松弛值赋为inf,然后开始先给当前的男生分配一个虚拟女生0号,然后试图增广,也就是while的主体部分,u为当前到的女生的编号,找到这个女生之前分配的男生x。我们枚举每个女生来更新松弛值,并记录更新的路径到pre中,注意这里每个女生在一次bfs中只能被访问一次,用一个vis记录一下就好。找到最小的delta之后,给所有经过的女生的期望值-delta,男生+delta,没走过的松弛值-delta。重复上述过程,直到发现没被匹配过的女生,
然后我们把这个增广路的匹配依次修改,最后计算答案即可。
好像说的不太清楚。。。。