标签:二叉树 联通 生成树 dfs 必须 容斥 表示 组合数 答案
显然一个绝对值最多选一次。这个性质非常强。
如果所有都是偶数,可以直接除以\(2\)。
否则\(1\)或\(-1\)必须选,暴力枚举选哪个然后递归,每层去重,发现最多只会递归\(\log a\)次。总复杂度\(O((n+a)\log n)\),等价于线段树上区间长度总和。
等价于不下降序列。
设\(f(x)\)表示最后一个数\(\leq x\)时的最优答案。显然它形如若干段斜率为整数的折线,且斜率是连续不降的。
最右边加入\(a\)时,每个位置加上\(|x-a|\),并对\(f(x-1)\)取\(\min\)。
只需要维护拐点,每次加入两个拐点,并删去最大的一个。
最后用\(f(0)=\sum|a_i|\)还原答案。
设\(f_{i,j}\)表示前\(i\)个数,和为\(j\)的方案数。每次转移要么放一个\(1\)在末尾,要么所有数均\(+1\)。
暴力dp可以维护每个数的\([0,m]\)次和,转移的时候乘上组合数。复杂度\(O(n^4)\)。
一点优化是维护每个数的下降幂(似乎组合数也可以),最后用第二类斯特林数还原答案,这样单次转移是\(O(1)\)的,复杂度\(O(n^3)\)。
考虑每个数产生的贡献有多少次。发现就是\(\sum_j[i\)出现至少\(j\)次的方案数\(]\)。
这个可以用\(f_{i,j}\)算,不需要dp的时候统计答案。复杂度\(O(n^2)\)。
牛顿恒等式:对于首一多项式\(F(x)=\sum_{i=0}^nC_{n-i}x^i\),设\(P_i\)为它的\(n\)个根的\(i\)次方和,对于任意正整数\(d\),有等式
\[\sum_{i=0}^{d-1}C_i P_{d-i}+C_d\cdot d =0\]
由\(C\)求\(P\):多项式求逆;由\(P\)求\(C\):多项式\(\exp\)。
本题硬点\(a_i\)是某多项式的\(n\)个根,分治fft求出多项式,求逆即可。复杂度\(O(n\log^2n)\)。
显然是个循环卷积,先DFT,用点值计算完再IDFT回去即可。
考虑容斥,用总数减去不连通的方案数。枚举\(1\)所在的连通块容斥,复杂度\(O(3^np)\)。
\(O(2^nn^2p)\)的做法有点麻烦,需要高超的生成函数技巧,掉线了。
二分答案,对每个数求出左右最近的满足条件的位置,设为\(L_i,R_i\)。
问题转化为判定是否存在\([l,r]\geq m\),使得区间内的任意元素满足\(L_i\geq l\)或\(R_i\leq r\)。
设\(solve(l,r)\)表示\([l,r]\)内是否存在满足条件的子区间。
如果\(r-l+1<m\),显然不行。
如果某个点\(L_i<l\)且\(R_i>r\),这个点就不能选,递归处理\(solve(l,i-1)|solve(i+1,r)\)。
暴力从左往右扫是\(O(n^2)\)的,考虑两边往中间扫,找到就return,这样是\(T(n)=T(i)+T(n-i)+O(\min(i,n-i))\)的,总复杂度\(O(n\log^2n)\)。
由于方案数不需要考虑顺序,可以直接dp,\(f_i=\max(f_{i-w_j}+w_j)\),同时更新方案数即可。
发现\(w_i\)不超过\(100\),即每次只有最近的\(100\)个状态有用。用\(\max\)定义加法,用加法定义乘法,发现是矩乘的变体。
直接做\(O(n^4\log m)\)。考虑预处理出转移矩阵的\(2^k\)次方,每次用向量乘\(O(\log m)\)个矩阵,总复杂度\(O(n^3\log m)\)。
枚举最大数之后,变成了求一些\(n\)很大,\(m\)不大的组合数。
组合数可以分治:\(C(n,m)=\sum_{i=0}^mC(x,i)\cdot C(n-x,n-i)\),其中\(x\)可以是任意\([1,n]\)的数。
在这里就是把\(A\)分成两半,递归处理然后fft合并。
由于每次都是除以\(2\)下取整,所以一遍就可以算出所有\(u\)的答案。复杂度\(O(n\log n\log A)\)。
设\(f_{x,y,a,b,i}\)为第一个序列\([x,x+i]\),方式为\(a\),第二个序列\([y,y+i]\),方式为\(b\)是否合法。
如果两个方式相等,直接判串是否完全相等。
如果其中一个是中序遍历,可以递归处理。
否则需要枚举左右儿子分界线。
看似\(O(n^4)\),实际上,确定了第一个序列的区间,第二个序列最多一个对应区间是合法的(点集完全相同)。所以总复杂度\(O(n^3)\)。
设\(work(l,r)\)表示处理\([l,r]\)的修改,并回答每次修改完的答案。
把修改涉及的边设为\(\inf\),跑最小生成树,此时不在其中的边(未修改的)已经没用了,直接删掉。此时边数为\(O(\)点数\()\)。
把修改涉及的边设为\(-\inf\),跑最小生成树,此时在其中的边一定有用,直接缩点。此时点数为\(O(r-l)\)。
递归两边处理,每次要对边排序。复杂度\(O(n\log^2n)\)。
随一个初始解,然后调整。
找一个不满足条件的点,把它换成一个可行的颜色。由于度数不超过\(7\),所以一定可行。
用队列模拟这个过程,每次调整后,两端颜色相同的边都会减少,所以一定会结束。复杂度\(O(m)\)。
标签:二叉树 联通 生成树 dfs 必须 容斥 表示 组合数 答案
原文地址:https://www.cnblogs.com/suwakow/p/11375073.html