SRM593 Div1Medium——May The Best Pet Win(bitset优化)
Description
给出n个元素取值的max、min,把这n个元素分割成两个集合,求如何分割使两个累和差的最大值最小
\(n\le 50,min,max\le 10000\)
Solution
把题意化归成式子,就是 求\(max(A\sum{max}-B\sum{min},B\sum{max}-A\sum{min})\)
- 由于已知\(A\sum{max}+B\sum{max}\),\(A\sum{min}+B\sum{min}\)
- 分别将其定义成Max和Min
- 那么上述式子可以化为\(max(Max-B\sum{min}-B\sum{max},B\sum{min}+B\sum{max}-Min)\)
- 可以发现我们只用计算出\(B\sum{min}+B\sum{max}\)的所有情况即可
- 观察数据可知,这个值可以穷举.
- 同时可以用bitset进行常数优化
SRM549 Div1Medium——Magical Hats(状压dp)
Description
有一个矩阵,矩阵中有num个帽子,有k个硬币塞在帽子下。
小Q有x次机会,每次选择一个帽子打开,小C可在打开帽子前改变硬币放的位置,且要总是满足每一列(行)帽子数+硬币数为偶数。
小C和小Q都足够聪明,求小Q收益的最大值。
\(n,m,k,num\le 13\)
Solution 剧毒的"聪明".
- 在这里,聪明大概可以理解为:小C总是让小Q取不到硬币,就算能取到,也是最小的硬币.而小Q会在未被打开的帽子中选择一个使自己收益最大的方案.
- 可以这么理解: 在小Q翻开这个位置之前,小C要决定在不在这个位置上放硬币.
- dp的定义为一个三进制数,来表示某一个帽子的状态.
- 表示确定这个帽子里不放硬币.
- 表示确定这个帽子里放硬币.
- dp的值为小Q能取到的硬币数
- 可以发现这个二进制数无形中维护了翻出硬币的个数(cnt of 2)还有翻开帽子(cnt of 1+2)的个数
- 利用记忆化搜索.当剩下的硬币都确定在哪时,就可以进行判定是否合法
- 当小Q的次数用完时,如果硬币还没放完,那就继续确定硬币的方法,如果有一种合法方案,就返回零
- 由于小Q是聪明的,他会选择最优的取的方案,这里去max
- 由于小C是聪明的,他能选择的是在不在小Q取的地方放硬币,所以这里取min
SRM552 Div1Medium——Fox And Flower Shop Div One(前缀和+DP+ST表优化)
Description
给出n*m的矩阵,格子有三种可能,为A,B或为空
求取出两个不相交的矩阵,使其\(|Sum(A)-Sum(B)|\le K\)且\(Sum(A)+Sum(B)\)最大
\(N,M<=30,K<=900\)
Solution
- 最暴力的写法n^8枚举两个矩阵 \(O(n^8)\)
- 然后稍微优化一波,预处理出以某个点为分界点,Sum(A)-Sum(B)时Sum(A)+Sum(B)的最大值,然后再求解 \(O(n^6)\)
- 再想一下,答案的两个矩阵一定分布在一行或一列的上下,这样枚举加验证的复杂度为 \(O(n^5)\) 这样就可以过了
- 但实际上代码可以再优化.也是枚举行或列,可以发现相邻的两行(列)之间是有递推关系的,所以不用重新算的.为了保证复杂度,关于差值\(\le K\)的方面可以用ST表解决,这样的复杂度为\(O(n^4+n^3logn)\)
SRM561 Div1Medium——Circles Game(博弈)
Description
给定一个森林,轮流取点,当且仅当子树一个点被取过,该点不能取.
Solution
- 可以发现,每个树都是一个子游戏.
- 取了一个点后,这个点到根节点的路径都不能取了,发现这样就把树有分割成了许多子树.
- 那么后继状态的sg值就是这些子树sg值的异或
- 为解决子树的sg值,就要先计算子树作为根时的sg值,由此递归,然后计算出答案.
- 时间复杂度\(O(n^2)\)
SRM568 Div1Medium——Equal Sums(建图)
Description
给定一个有未知数的待补充矩阵,给定的值满足小于等于9,并且要使矩阵满足在所有列中取一个数,并且所有数的行编号要不同,使所有这样的组合的和都相同.
求方案数(mod1e9+7)[满足有有限解]\(n\le 50\)
Solution
- 可以得到结论,对于满足这样关系的矩阵,每行每列都有特征值
- 那么对于已知的值,只用枚举行特征值(枚举次数<=10),就可以知道行的特征值.
- 由于这些递推关系可以传递,所以可以连边,枚举一个值之后就把联通的特征值全部计算出来
- 但同时要考虑去重,因为如果每列特征值都+1,行特征值都-1,那么结果也会满足条件.但这样的结果是一样的,不能重复算
- 所以只要使列特征值的最小值严格等于0就好.
- 关于这个可以通过容斥解决
SRM416 Div1Medium——CustomDice
Description
求使互不相同六个正整数的和小于等于n的方案数.
\(n\le1e6\)
Solution
- 难点在于很难让这六个数不同.
- 先令这六个数有序,设这六个数为\(a_1,a_2,a_3,a_4,a_5,a_6\)
- 令\(b_1=a_1,b_2=a_2-a_1...b_6=a_6-a_5\)
- 同时发现:\(6b_1+5b_2+4b_3+3b_4+2b_5+b_6=n\)
- 然后问题就转换成找到\(b_{1...6}>0,\sum_{i=1}^{6}b_i*i<=n\)的方案数.
- 然后直接dp转移+前缀和优化就好了,时间复杂度\(O(6n)\)