51nod泛做(1)

不顾一切地提高数学能力
咯嗦的奇怪题解
现做 : 6

1673 树有几多愁

性质神奇的题目 , 考虑利用叶子 \(<=20\) 这个条件进行状压DP。
对于每一个状态需要知道下一个应该填什么数 , 如果直接对整个树算就是单次O(n)的。
所以我们建一个虚树来优化这个过程 , 把O(n)压到和叶子结点同一阶就行了。
叶子结点数为n , 复杂度为 \(O(n 2^n)\)

1589 移数博弈

一类比较常见的区间题目 , 刚开始看错数据还以为 \(O(n)\) 不可做的结论题qwq。(同学们一定要注意审题啊敲黑板)
我们对每个 \(a_{i}\) 求以它为第二大数的区间的贡献 。
令 $ L1 , L2 $ 分别为左边第一个比它大的位置 , 左边第二个比它大的位置 , $ R1 , R2 $ 同理。
此时 $ a_{i} $ 为区间第二大的贡献为

\[((R1 - 1) - i + 1) * (L1 - L2) * a_{i} * a_{L1} + (i - L1) * ((R2 - 1) - R1 + 1) * a_{i} * a{R1} \]

为了维护这些位置我们用链表表示数列 , 然后按权值从小到大处理 , 处理完一个删除一个 ,这样就可以保证对于每个位置,在链表中前后都是比它大的第一个数。
为了保证 \(O(n)\) 所以我们使用桶排就行了。

1293 球与切换器

这题... , 普及组吧
对每个格子 \((i , j)\) 分别记录从上进入的球数和从左进入的球数 , 因为每个球只会从右边出去或下边出去,所以我们可以从上到下从左到右枚举格子而不会漏掉。
其次对于每个不为 \(0\) 的格子会有分别有一半的球向右和向下,总球数为奇数时特判一下第一个球会往哪里走就行了,比如说格子为 \(-1\) 时往下走的球会比往右走的球多一个。
注意一下不能直接除 \(2\) , 要用 $ >>1$ 。
最后算出来 $ (n + 1 , m) $ 从上进入的球数就是答案。

1436 方程的解数

这题一看到就瞬间傻掉了 , 什么鬼玩意。
根据这类题的套路,首先可以独立考虑 \(k\) 的每一个位,对于每一个位可以有 $ 2^n $ 种情况,所以我们先考虑第 \(i\)\(0\) 的时候会发生什么。
显然对于 \(a_{i}\)数列 , 不存在两个相邻的 \(a_{i}\) 的第 \(i\) 位同时为 \(1\) , 其方案数也等于没有两个相邻 \(1\)\(01\) 序列数。
\(dp_i\) 为长度为 \(i\) 的满足上述条件的 \(01\) 序列的方案数 , 发现 \(dp_{i} = dp_{i - 1} + dp_{i - 2}\) 可以直接递推到 \(n\)
可以这样想,我们现在已经得到了 \(i - 1\)\(i - 2\) 的方案数 , 直接在 \(i - 1\) 后面补 \(0\) 可以得到 \(dp_{i - 1}\) 个方案数 ,但是要补 \(1\) 需要满足 \(i - 1\) 最后一位为 \(0\) , 我们可以在 \(i - 2\) 后面补 \(0\) 再补 \(1\) ,这样得到了 \(dp_{i - 2}\) 的方案数。
当第 \(i\) 位为 \(1\) 时 ,方案数就是 \(2^n - dp_{n}\) 即可。
题目中给出的 \(n\) 较大 ,但可以用矩阵快速幂去算。
膜讨论区大佬
坑点极多,出题人极其毒瘤

1519 拆方块

每一堆方块 ,经过多次操作后会等于 $ min( h_{i - j} , h_{i - j + 1} - 1 , ... , h_{i - 1} - k + 1 , h_{i} - k , h_{i + 1} - k + 1 , ... , h_{i + j - 1} -1 , h_{i + j} ) $
我们所求的就是 \(k = min(h_{i - j} + j)\)\(k = min(h_{i + j} + j - i\)
左右扫描一遍 \(dp\) 就行了。

1962 区间计数

递减单调栈算贡献。

posted @ 2018-05-05 10:56  FranceDisco  阅读(163)  评论(0编辑  收藏  举报