- (n)个点,要求连一棵树,设点(i)的度数为(d_i),则其贡献为(f(d_i)mod 59393),其中(f(x))是一个(k)次多项式。最大化总贡献。(nleq 3000, kleq 10, a_ileq 50)。
对于任意一种度数序列,都可以生成一棵对应的树。
每个点度数(geq 1),(-1)后等于(n)个点分(n-2)个度数。
(O(n^3))dp:(f_{i,j})表示前(i)个点,度数和为(j)的最优解,转移的时候枚举新点度数。
实际上不需要限制非(0)数的个数,直接枚举度数做完全背包,(O(n^2))。
dp时很多状态是非必要的,通过一些转化,去掉它们就可以优化很多。
(顺便一提,模数是ntt模数,然而这题和ntt没什么关系)
(f_{i,j})表示第(i)个单位,血量为(j)的概率。
询问的时候对每个单位算出(g_{i,j}),表示除了第(i)个单位之外,有(j)个单位存活的概率。先把所有单位的背包算出来,每个单位的(g_i)相当于退一个背包,用除一个(ax+b)的方法,可以做到单次(O(n^2))。
复杂度(O(nm+n^2C))。
- 一个(n)个点的图,求(k)个叶子的生成树个数。(nleq 15)。
一种dp:设(f_{{a_1.…,a_n}},a_i={0,1,2}),表示每个点没选/选了,是/不是叶子的方案数。
然后这个dp被ytq枪毙了。
考虑容斥,枚举叶子集合,剩下的点Matrix-Tree求出生成树个数,然后把叶子挂在生成树下面。用fmt/fwt优化容斥,复杂度(O(3^n))。
- 有({2…n}),共(n-1)个数。两个人各取一个子集(S,T),要求不存在(xin S,yin T),使得(gcd(x,y) ot=1),求方案数。(nleq 500)。
(x^2leq 500)的质数最多(8)个。
意味着对于一个数,不属于这些质数的质因子最多一个。
枚举(8)个质因数中每个属于(S,T),还是都不属于。dp大质数各自属于哪个集合即可。复杂度(O(3^8cdot n))。
- (n imes m)的网格,每个位置有权值。选若干个位置,满足任意两个位置八方向不连通,求最大权值。(nleq 12,m leq 100)。
插头dp经典问题。
- (n)个点的有根森林,两个人轮流选点,删去这个点的祖先和它本身,保留其余点的父子关系(即,可能生成若干棵树)。不能操作者输,求先手是否必胜。(nleq 10^5)。
设(f_i)表示以(i)为根的子树的sg函数,对每个点暴力dfs,(O(n^2))暴力很好做。
发现一个儿子转移到父亲,它的子问题的sg函数,需要整体xor上一个值,用trie维护,直接线段树合并就可以了((01)trie的本质就是一个二进制分组的权值线段树)。
- 平面上有(2n)个球,有(2n)个机器人,分别位于横、纵轴([1,n])的位置。激活一个机器人会拿走它坐标轴垂直方向最近的球。问多少顺序可以拿走所有球。(nleq 10^5)。
建(2n)个点分别表示第(i)行和第(i)列。对于((x,y))的球,从(x)行向(y)列连边,边权为(x+y)。每次激活一个点,等于选了与它相连的剩余权值最小的边。
考虑合法的方案,要求每个连通块边数等于点数,且每个点出度为(1)。发现是一个基环内向树。
环上枚举顺时针或逆时针,树上可以直接树dp。
- 数轴上有(n)个点,第(i)个的位置是(x_i)。你的起点是(0),终点是(E),速度是(1)单位每秒。对于每个点,设第一次走上去的时间为(t_i),则会在(t_i+T)时刻产生一个硬币。求收集所有硬币并走到终点的最小时间。(nleq 10^5,0 < x_i < E)。
设(f_{i})表示最后一次在(x_i)处回头的最小时间,列出暴力方程:
取(max)表示路程太短没法生成硬币,需要等一会。
拆成两部分dp,对于(max=T)的一部分,可以单调队列优化。否则就是一个前缀最小值。可以线性完成。好水啊
- 给一个序列(a_i),对每个(i)找一个最小的(p_i),满足对所有(j)有(p_igeq a_j-a_i+sqrt{|i-j|})。(nleq 10^6)。
有个比较显然的(O(nsqrt n))做法,即枚举平方根,对每个平方根用单调队列优化。
四边形不等式:若(w_{i,j})满足内内+外外(geq)内外+外内,则称(w_{i,j})满足四边形不等式,利用(w_{i,j})转移的方程满足决策单调性。
利用决策单调性优化方程需要快速算出(w_{i,j}),或(w_{i,j})满足莫队性质。
一般情况下是分治计算,即,暴力算出(mid)处的最优位置,然后递归两边。
暴力做法:枚举中位数(mu),每条边拆成(a_i,2mu-a_i)两条边,分别为黑和白。就转化为了(k)白边最小生成树,wqs二分即可。复杂度(O(nmlog acdot alpha(n)))。
结论:最大生成树只包含(wgeq mu)的黑边和(w<mu)的白边。
发现枚举(mu)的操作只对白边有影响,可以和wqs二分放到一起,复杂度(O(mlog acdot alpha(n)))。
- 有一个二进制串,初始全是(0)。现在有(m)次操作,每次操作有(p_i)的概率给这个串加上(2^{a_i}),一次操作的代价是这次操作导致二进制串变化的位数,求所有操作的期望代价和。(a_i,mleq 2 imes 10^5)。
答案等于所有过程进位次数加上最后保留的(1)的个数,所以操作顺序对答案没有影响。
(f_{i,j})表示前(i)位,这一位被加了(j)次的期望,则(f_{i,j})可以转移到(f_{i+1,lfloorfrac{j}{2} floor})。
操作等于乘以一个(p_ix+(1-p_i))的多项式,可以分治fft。
假设某个位置操作了(y)次,则它最多进位(log_2y)次,相当于每个多项式最多前进(log)步。只需要处理有用的部分即可。复杂度(O(nlog^2n))。