重温 匈牙利算法 树状数组

再次回忆匈牙利算法和树状数组,除了算法的大概思路,其他已经不记得什么了。

匈牙利算法:

这个找二分图最大匹配的算法,就是不断的在当前匹配M上找这个匹配对应的一条增广路径P,根据M,P获得一个更大的匹配M',不断迭代直到找不到增广路径。

树状数组:

最简单的应用就是在log的时间级别更新、查询一个序列的区间和,通过维护数组数组可以在log时间内获得数组的前N项和,思路跟拆整数类似,一个整数可以拆成若干个二次幂的和,那么N项序列也可以拆成不超过logN个的2次幂个数的序列之和,

C[i]用来记录A[i-2^r+1]...A[i]这些项,一共有2^r个项,r表示的是i写成二进制后末尾0的个数,

有两个重要的操作,一个是查询前N项和,一个是更新第i项内容,查询前N项和,则是每次更新当前索引,将当前索引idx指向idx-2^r。而查询则是更新C数组,每次将当前索引idx移向它的父亲idx+2^r,通过反证法可以证明该索引是idx的父亲,注意上述两个r不是同一个r。

你可能感兴趣的:(树状数组)