二分图左部点和右部点个数都<=18
代价:$\sum M_i^{D_i}$ $M_i$是左部点的一个权值 $D_i$是左部点新图中的度数
法一:
爆搜+最优化剪枝+合理化剪枝=可过?
法二:
易证,新图所有右部点最多连一个边。
所有右边的点,原图度数总和最多是54
若爆搜右边点的连边,那么最多的复杂度,就是右边所有点度数都是3(用均值不等式可以证明!)
这样是$3^n$,加剪枝就可过了。
法三:(我的)
暴力枚举左部点选择情况+网络流决定边的选择情况
Mi=1要特殊处理。
加上各种剪枝跑得飞快?
(260行代码,写去吧)
法四:(看上面博客)
折半爆搜+子集求前缀和
(利用左部点只会向编号更大的右部点连边)
K - Tree
求树上点对,满足:
n,k是1e5
注意:up to是<=k
做法:
法一:DSU On Tree
全局桶---->全局n棵动态开点权值线段树(维护区间和)
线段树的编号是v[x],内部权值位置是dep[x],
正常维护即可。
相当于枚举z(LCA)
空间:O(nlogn)
时间:O(nlog^2n)
法二:线段树启发式合并
线段树外层是v[x]编号,叶子再挂上为权值dep[x]的线段树
然后儿子之间启发式合并,查询+统计答案。
采用节点回收,让空间复杂度可以降下来。
空间:O(nlogn)
时间: O(nlog^2n)
(但是难写很多)
总结:
DOT是个好东西。全局数据结构就是好!
(解决有根树点分治)