12.1·点分治·splay
点分治:主要思想是找到重心,然后把问题分为经过中心和不经过重心两种情况,对于不经过的递归讨论,然后只用做经过重心的就行了。由于是重心,所以最多log(n)层。
Splay:背熟版,考虑怎么用splay模拟 。
例题:
Tree POJ741
这道题是点分治的经典题,由于我已经A了这道题,就详细讲讲吧。首先还是按照常规思路点分,在统计答案时只需要求出所有点距离重心的距离,排一遍序统计就可以了,记得要去重。
[IOI2011]Race bzoj2599
用map存每个点到重心的距离,然后记录到根节点边权和为w时所有节点深度最小的。(有点卡常)。
聪聪可可bzoj2152
跟前一道相似的思路 ,记录%3为0,1,2的就行了(貌似还简单一点)。
Tree hdu4812 D
先处理出逆元,然后数组a[x]分治时,到重心的点权乘积(不含重心)在模mod下为x的点的编号最小是多少。查询时只需要搜a[k*inv[dis[u]*w[重心]%mod]%mod]就可以了。
Amaz1ng Prime CDOJ1562
用数组a[i]表示权值和为i的路径数,b[i]表示到重心的距离为i的点数,则a[x]=b[0]*b[x]+b[1]*b[x-1]+...+b[x]*b[0],用FFT处理一下就行了。(。。。)
采药人的路径bzoj3697
对每一个点存这个点到根节点的点权和并记录在这个点到重心的路径中是否存在一个点的点权和等于这个点的点权和,则点分治讨论到一个点时,如果这个点权为0,则可以和其它的0匹配,如果有标记,则自己到重心也可以。如果点权不为0,则可以和其他任意有标记的点匹配,如果有标记,则还可以和有标记的点匹配。
Attack and Defense Osipovsky Cup 2014Problem A.
把左括号当作1,右括号当作-1,则是两点权值前缀和为0且前缀和的前缀<=0(右部分)或>=o(左部分)
------------------点分治·完------------------
普通平衡树 bzoj3224
裸题,一定要背熟板子!!!
宠物收养所 bzoj1208
把人和宠物分别存两棵平衡树,基础操作。
书架 bzoj1861
记一个pos[i]表示i的位置,val[i]表示i位置的书的编号,基础操作。
永无乡 bzoj2733
平衡树启发式合并,很好懂的splay题,除了我不会启发式合并。。。
Army Formationshdu6133
还是启发式合并,考虑加入一个值就可以简单易懂了。注意的是由于权值可能重复出现,所以每个结点记个cnt数组。(将一个值塞进树时,将它的splay到根,然后答案加上左子树的权值和,再加上(右子树的权值的个数+该结点的cnt)*该结点的权值。)
【洛谷线段树1】
Splay维护区间信息,需要打标记并下放标记。
文艺平衡树 bzoj3223
还是splay维护区间,输出答案时dfs整颗Splay树,自上而下下放标记(反转标记),然后输出先序遍历。
Cards Sorting CodeforcesRound #424 Div. 1 B.
每次找到最小值并旋转到根,然后答案加(左子树size+1),交换左右子树。
------------------------------splay·完------------------------