小W的神奇口胡

这里会口胡一些乍一看会做,或者没时间写(或者懒得写)的题目,或者一道题目的其他解法,应该很少更新,不用等了……

【BZOJ3456】城市规划-分治NTT
测试地址:城市规划
题目大意: n 个点带标号简单无向连通图(即无重边,无自环)的数目。
做法:本题需要用到分治NTT。
实际上这题做法挺多的,我用多项式求逆写了这一题,据说还可以用多项式求ln写,有待学习。
f ( n ) 为我们要求的答案, g ( n ) 为不要求连通时的答案,显然 g ( n ) = 2 C n 2 。那么有如下递推式:
f ( n ) = g ( n ) i = 1 n 1 C n i f ( i ) g ( n i )
实际上是在枚举点 1 所在的连通块大小 i (这个在多项式求逆做法中也差不多)。
把组合数拆开后有:
f ( n ) = g ( n ) n ! i = 1 n 1 f ( i ) i ! g ( n i ) ( n i ) !
后面的和式显然是一个卷积的形式,然而这个卷积涉及 f 自己,所以使用分治NTT即可,我们就以 O ( n log 2 n ) 的时间复杂度完成了这一题(但多项式求逆 O ( n log n ) ……)。

【HDU5201】The Monkey King-容斥
测试地址:The Monkey King
题目大意: m 只猴子分 n 个桃,其中猴王必须分得严格最多数量的桃,问方案数。
做法:本题需要用到容斥。
哇,我怎么这么菜,连这种容斥水题都看不出来了……
首先显然枚举猴王能得到的桃子数量 i ,要求剩下的猴子得到的桃子数都小于 i 的方案数,直接算不行就容斥,强制某些猴子得到的桃子数大于等于 i ,然后剩下的分配就是经典的隔板法了,因此我们有以下式子:
i = 1 n j = 0 n i 1 ( 1 ) j C m 1 j C n i j + m j 2 m j 2
暴力计算即可,时间复杂度为调和级数 O ( n log n )

【HDU5773】The All-purpose Zero-贪心+DP
测试地址:The All-purpose Zero
题目大意:给定一个序列,有若干个 0 ,可以把 0 变成任意数字,问此时能得到的最长上升子序列长度。
做法:本题需要用到贪心+DP。
这题需要注意到一个非常重要的结论:把 0 全部拿上一定是不亏的。因为对于任意一个不拿完 0 的上升子序列,我们都能把某个数字改成对应位置的 0 来表示。因此我们直接默认取走全部的 0 ,而对于剩下的序列,因为 0 默认取了,那么跨过若干个 0 时,两个数的差就必须大于等于中间 0 的个数 + 1 才能接上,那么我们直接把每个数减去它前面 0 的数量,对这个序列做LIS,然后加上 0 的数量即可,时间复杂度为 O ( n log n )
不过从一般的求LIS的DP上想也是可以的,我们在DP中要维护一个数组 d ( i ) ,表示长为 i 的上升子序列的末尾元素的最小值,不难发现 d 应该是严格递增的。而在遇到一个 0 时,事实上 d 会产生这样的变化:先全部 + 1 ,再整体右移一位。所以我们以这样的方式也可以得到和上面差不多一样的结论。

【BZOJ2924】Flat Broken Lines(POI1998)-Dilworth定理+DP
测试地址:Flat Broken Lines
题目大意:题目上有 n 个点,定义一条平直折线为,每一条线段与 x 轴的夹角都在正负 45 度以内的折线,问至少需要画多少条平直折线才能覆盖所有的点。
做法:本题需要用到Dilworth定理+DP。
考虑一个点,它下一步能画到的区域是一个夹角是直角的四分之一平面,所以我们把整个坐标系转 45 度,这样就可以变成一个二维平面上的最小偏序路径覆盖问题,用TJOI2015-组合数学那道题的做法做即可。

【BZOJ5093】图的价值(LYDSY1711月赛)-NTT+第二类斯特林数
测试地址:图的价值
做法:本题需要用到NTT+第二类斯特林数。
容易想到分开计算每个点的贡献,于是我们枚举这个点的度数,其它边随便连,我们就能得到:
a n s = n 2 C n 1 2 i = 0 n 1 C n 1 i i k
这个式子的后半部分,在CF932E-Team Work那题中推过了,用第二类斯特林数以及NTT即可 O ( k log k ) 算出答案,于是我们就解决了这一题。

猜你喜欢

转载自blog.csdn.net/maxwei_wzj/article/details/80751696