T1炸了
别的没啥。
T1
(K>n)我就会死,窝阶乘只处理到了(n)。
其实挺简单的一个题。
就是要求关于某一段路径,其两端分别连接(K)条不相交路径的方案。
考虑一个点,他的儿子称为(ch_i)。
那么方案数的生成函数就是:
[F(x)=prodlimits_{i}(sz[ch_i]x+1)
]
这个可以直接分治(NTT)来计算。
然后由于可以选这个路径端点。
那么最终这个点的方案数就是:
[sumlimits_{i}A_k^i[x^i]F(x)
]
然后这样就可以统计没有祖先关系的路径的方案了。
考虑有祖先关系的。
无非是选定一个儿子。
然后令:(F(x)=F(x)frac{(n-sz[x])x+1}{sz[ch_i]x+1})
然后就直接竖式乘除暴力算就可以了。
对于一个节点来说,最多被计算的次数是(sqrt{n}),其子树的大小总共只有(sqrt{n})种。
然后每个节点最多做(sqrt{n})次竖式乘除。
而每个节点的儿子数是(num_i)。
复杂度是:
[O(sumlimits_{i=1}^{n}num_isqrt{n}=O(nsqrt{n})
]
T2
(n=2,3)的时候贪心一下就行了。
(n=4)的时候写个(dp),表示当前已经积累的选择的左端点个数。
然后有两种选择。
当前点作为左端点或者右端点。
答案就是:(dp[n][0])
然而这个是(O(n^2))的。
考虑用贪心做这个东西。
一直选择当前点为左端点,如果当前的(sum<0)那么就直接选择之前最大的某一个位置来更新答案。
T3
[ans=left|f-frac{s_r-s_l}{r-l}
ight|=left|frac{fr-s_r+fl-s_l}{r-l}
ight|
]
那么把({i,fs_i})捏成点。
求得就是两点间的斜率绝对值的最小值。
按照第二维排一下序就(OK)。