Summary - 2015.2.3 分治

来源:互联网 发布:淘宝设置自动发货 编辑:程序博客网 时间:2024/05/29 17:26
一、random(序列第K大元素)
        随机数列A[1..n] (n <= 5e6), 求第k大元素
        江哥说快速选择思想来源于快速排序。
        每次随机挑选数列中一元素a,求出比a小的元素个数l1和比a大的元素个数   
        l2,若k <= l1,则保留小于a的元素;若k > l1, 则保留大于a的元素,同时
     k -= l1。直到数列中元素全部相等。即得到答案。

二、sequence(最大连续子段和)
    数列A[1..n],Q个询问:L..R 最大连续子段和 (n <= 1e5, Q <= 1e6)
    首先,需要读入优化。
    1、线段树(70'):
        维护结点的区间和、最大前缀和、最大后缀和、最大连续子段和即可。
        话说我写了三个query(),分别对应区间最大前缀和、后缀和、连续子段和,
        江哥说只要一个,,不知道该怎么搞啊
    2、某分治(100’):
        【还未写出,待补充】

三、tree
    一颗n个点的无根树,求出树上长度为k的路径总数。(2 <= k <= n <= 1e5)
    首先一点,树的分治,一般是点分治,容易被菊花树、挂链之类的卡,所以要求
    树的重心(最大子树结点最少的结点)作为根,这样可以使树尽量均匀,防止。
    
    考虑过根节点的所有满足条件的路径数 P,
        cdep[i][j] :第i棵子树中深度为j的节点数
        sdep[j]    : 所有深度为j的节点数
    则这样可以求得 P
        P = sdep[k];            // 特判直接从子树内部连至根的情况
        // 以下是两节点分别在不同子树的情况
        For i = 1 to MaxDep:
            For j = 1 to MaxSubtree:
                P += cdep[j][i] * (sdep[k - i] - cdep[j][k - i]);
    然后对于每棵子树,提出其重心作为根,重复上述过程。
    (P.S. 还没写出来,Q : 这样 DFS 不会 TLE? A by 江哥 : 不会。)
0 0
原创粉丝点击