2019 ICPC 南昌 Regional 部分题解_搜索

 

二分图左部点和右部点个数都<=18

代价:$\sum M_i^{D_i}$ $M_i$是左部点的一个权值 $D_i$是左部点新图中的度数

 

 法一:

爆搜+最优化剪枝+合理化剪枝=可过?

 

法二:

易证,新图所有右部点最多连一个边。

所有右边的点,原图度数总和最多是54

若爆搜右边点的连边,那么最多的复杂度,就是右边所有点度数都是3(用均值不等式可以证明!)

这样是$3^n$,加剪枝就可过了。

 

法三:(我的)

暴力枚举左部点选择情况+网络流决定边的选择情况

Mi=1要特殊处理。

加上各种剪枝跑得飞快?

(260行代码,写去吧)

 

法四:(看上面博客)

折半爆搜+子集求前缀和

(利用左部点只会向编号更大的右部点连边)

 

​K - Tree​

 求树上点对,满足:

2019 ICPC 南昌 Regional 部分题解_搜索_02

 

 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是个好东西。全局数据结构就是好!

(解决有根树点分治)