这里会口胡一些乍一看会做,或者没时间写(或者懒得写)的题目,或者一道题目的其他解法,应该很少更新,不用等了……
【BZOJ3456】城市规划-分治NTT
测试地址:城市规划
题目大意:求
个点带标号简单无向连通图(即无重边,无自环)的数目。
做法:本题需要用到分治NTT。
实际上这题做法挺多的,我用多项式求逆写了这一题,据说还可以用多项式求ln写,有待学习。
令
为我们要求的答案,
为不要求连通时的答案,显然
。那么有如下递推式:
实际上是在枚举点
所在的连通块大小
(这个在多项式求逆做法中也差不多)。
把组合数拆开后有:
后面的和式显然是一个卷积的形式,然而这个卷积涉及
自己,所以使用分治NTT即可,我们就以
的时间复杂度完成了这一题(但多项式求逆
……)。
【HDU5201】The Monkey King-容斥
测试地址:The Monkey King
题目大意:
只猴子分
个桃,其中猴王必须分得严格最多数量的桃,问方案数。
做法:本题需要用到容斥。
哇,我怎么这么菜,连这种容斥水题都看不出来了……
首先显然枚举猴王能得到的桃子数量
,要求剩下的猴子得到的桃子数都小于
的方案数,直接算不行就容斥,强制某些猴子得到的桃子数大于等于
,然后剩下的分配就是经典的隔板法了,因此我们有以下式子:
暴力计算即可,时间复杂度为调和级数
。
【HDU5773】The All-purpose Zero-贪心+DP
测试地址:The All-purpose Zero
题目大意:给定一个序列,有若干个
,可以把
变成任意数字,问此时能得到的最长上升子序列长度。
做法:本题需要用到贪心+DP。
这题需要注意到一个非常重要的结论:把
全部拿上一定是不亏的。因为对于任意一个不拿完
的上升子序列,我们都能把某个数字改成对应位置的
来表示。因此我们直接默认取走全部的
,而对于剩下的序列,因为
默认取了,那么跨过若干个
时,两个数的差就必须大于等于中间
的个数
才能接上,那么我们直接把每个数减去它前面
的数量,对这个序列做LIS,然后加上
的数量即可,时间复杂度为
。
不过从一般的求LIS的DP上想也是可以的,我们在DP中要维护一个数组
,表示长为
的上升子序列的末尾元素的最小值,不难发现
应该是严格递增的。而在遇到一个
时,事实上
会产生这样的变化:先全部
,再整体右移一位。所以我们以这样的方式也可以得到和上面差不多一样的结论。
【BZOJ2924】Flat Broken Lines(POI1998)-Dilworth定理+DP
测试地址:Flat Broken Lines
题目大意:题目上有
个点,定义一条平直折线为,每一条线段与
轴的夹角都在正负
度以内的折线,问至少需要画多少条平直折线才能覆盖所有的点。
做法:本题需要用到Dilworth定理+DP。
考虑一个点,它下一步能画到的区域是一个夹角是直角的四分之一平面,所以我们把整个坐标系转
度,这样就可以变成一个二维平面上的最小偏序路径覆盖问题,用TJOI2015-组合数学那道题的做法做即可。
【BZOJ5093】图的价值(LYDSY1711月赛)-NTT+第二类斯特林数
测试地址:图的价值
做法:本题需要用到NTT+第二类斯特林数。
容易想到分开计算每个点的贡献,于是我们枚举这个点的度数,其它边随便连,我们就能得到:
这个式子的后半部分,在CF932E-Team Work那题中推过了,用第二类斯特林数以及NTT即可
算出答案,于是我们就解决了这一题。