其他分享
首页 > 其他分享> > 金华集训0729总结

金华集训0729总结

作者:互联网

分治 图论 字符串

每一个大知识点分出很多小知识点,有些知识点尚未完全理解(蒙)
很多都没有学过啊,老师第一次讲的挺着急的,我也听的雾。

一.分治:

普通分治:

通过划分区间,将问题变为多种情况,一些可以转换为子问题处理,跨区间的特殊处理。
例1求一个区间所有区间的最大值之和

假设a[x]为区间a[l…r]的最大值,那么区间可分为在x左边,在x右边这两种情况就转换为子问题解决,还有一种情况就是跨越了x,那么此时的最大值就是a[x],此时一共有(x-l+1)*(r-x)个区间满足,可以O(1)计算贡献。接下来的问题就变成了如何快速求出区间的最大值【线段树,ST算法】

例2:求一个区间的所有区间最大值最小值乘积之和

这时有最小值,再像上题一样以最大值为界限分开就不太优秀了。在[L,R]区间中我们枚举一个中间点mid划分区间,显然所有区间可分为在mid左边,在mid右边以及跨越mid,前两种情况可变为子问题解决,考虑跨越mid的区间的贡献。明显分为4种情况,枚举左端点X,计算有多少右端点Y满足。
预处理:Ma[L]表示R>mid且[L,R]最大值在[L,mid]上的R的最大值,Mi[L]表示R>mid且[L,R]最小值在[L,mid]上的R的最大值

情况1:最大值和最小值都在[X,mid]内,那么Y的取值就是[mid+1,min(Ma[X],Ma[Y])],这种情况下最大值和最小值是固定的,那么贡献也好搞了。
情况2:最大值在[X,mid]内,最小值在[mid+1,R]内,Y的取值范围就是[Mi[X]+1,Ma[X]],那么贡献也比较好求,最大值是固定的,最小值就相当于是一个以mid+1为起点的前缀最小值,预处理很方便。
情况3和情况4就是情况1和情况2的对称。

例3二维平面的最近点对

将一个点图取一个中间线mid,左右为n/2个点,求出两边各自的最近点对d1,d2(转化成了子问题),令d=min(d1,d2)那么我们就要尝试从左边取出一个点和右边一个点相连使得距离能够小于d。
考虑枚举左边的点,将横坐标和mid差值大于d的直接省略,这个点与右边点相连距离一定大于d。然后考虑右边点的纵坐标与左边点的纵坐标的绝对值小于d,横坐标的绝对值也小于d,那么最终选的范围会变成一个矩形,长为2d,宽为d,因为要右边的点两两距离>=d,所以可能的合法右端点最多只有6个【别问我why】,那么时间复杂度就得到了保证,实现细节优化,按纵坐标排序枚举,合法的右端点区间随着左端点而移动。

例4问一个区间中有多少个连续的区间
连续区间:(3,1,2),(1,2,3),(1,3,2)…等都是连续区间
显然一个区间是连续区间满足:该区间的最大值-该区间的最小值+1=区间长度。
类似于例2的做法,枚举一个mid,对于左右两边的子问题递归处理,然后对于跨mid的区间也是分成四种情况,预处理和例2类似,枚举左端点,检查右端点的合法性即可。

点分治(坑)

点分治就是在树上做分治,常用于解决树上路径等问题。
树上路径的分类:1.经过root 2.不经过root,在root的子树中
有了这条性质,我们就可以对树上的路径进行分治:先将经过root的路径处理完,此时root的各个子树上的路径就互不影响了,故可以递归分治。
但怎么使得分治均匀呢?如果随意选择根节点,则如果树退化成链,则递归层数为N,且每次操作的节点数目都会非常多。
所以此时,我们选择树的重心,这样可以使每一次分治后剩下的最大子树的大小下降最快(重心的最大子树最小),每一次分治我们都找重心,操作本身复杂度为O(NlogN),可以使分治底层执行次数降到O(NlogN)(主定理)。
具体代码还不会,是个坑。
可以参考的博客

cdq分治(坑)

cdq分治是一种分治(这不是废话嘛),和一般的分治一样,它先考虑前半部分,再考虑后半部分,再考虑前半部分对后半部分的影响,而cdq分治的精髓就在于处理前半部分对后半部分的影响。
推荐题目:三维偏序,缺1背包问题,矩形加法求和
是个坑

整体二分(坑)

不用splay就可以搞得区间第k大值的方法。
将所有询问一起二分答案…
是个坑。

二. 图论

一般的最短路和最小生成树,tarjan差分约束还是要多多去温习的。

prufer序:

• 将一棵树变成一个序列:
• 每次选择树上标号最小的叶子,删掉它,将与它相连的那个点的标号加到序列里,直到只剩下 2 个点
• 可以证明:任意一个长度为 n-2 的 1…n 的序列都是某棵树的 Prufer 序列
• 所以可以推出:n 个点的无根树个数为 n^(n-2)
性质:一个节点的度数为x,在prufer序列中出现的次数也为x。

例题给定每个点的度数 d[i],求有几棵这样的无根树
根据上述结论可以进行转化为prufer序列,且每个点出现的次数为该点的度数,然后就变成了排列组合问题。

二分图:(坑)

定义:可以分成两部分,使得这两部分内部没有边的图
一个图是二分图等价于该图没有奇环。
奇环的判定:二分图染色,有相邻的点的颜色相同就是有奇环。
偶环的判定:(是个坑)

二分图匹配还不会,GG了

一些性质:
最⼩顶点覆盖:选最少的点覆盖所有边
|⼆分图最⼩顶点覆盖|=|⼆分图最⼤匹配|
最⼤独⽴集:选最多的点使得它们两两没边相连
|⼆分图最⼤独⽴集|=总点数-|⼆分图最⼩顶点覆盖|

Hall 引理:
设S 是左边点的⼀个⼦集,设N(S) 为S 所有点邻居的并
集,则⼀个⼆分图存在完美匹配的充要条件是:
对于所有S,∣S∣<=∣N(S)∣∣S∣<=∣N(S)∣ |S|<=|N(S)|∣S∣<=∣N(S)∣

三.字符串(讲太快了吧,大坑)

KMP算法

利用最大前后公共缀长度next[]数组实现字符串的快速匹配
补习知识:a[1…i]的最小循环节=i-next[i]+1
TIRE树上做KMP就成了AC自动机。
例题(坑):
• 给定一个字符串 S,对于每个前缀S[1…i]求出:有几对前后缀相等且不重叠. |S|<=1000000
• 给定一个 m 位数字串 S,求有几个长度为 n 的字符串 T,满足 S 不 是他的子串. m<=20. n<=10^9
• 有一个串 S,给定 S[1…i] 的最小循环节 d[i],构造一个字典序最小的 S. |S|<=10^6
• 有一个串串 S,定义一个优秀的拆分是将一个串表示成 AABB 的形式, 求 S 的所有连续⼦串的优秀的拆分的个数之和. |S|<=2000

后缀数组(大坑先放)

总体来说貌似只有普通分治稍微好一点,整体二分,cdq分治,点分治要去填坑。

图论基本要温习,一些变化形式要多去思考。二分图要填坑。

字符串老师讲得太快了,一头雾水,尤其是后缀数组一脸懵B,KMP算法以及其扩展要深入理解

标签:二分,0729,最大值,分治,mid,最小值,区间,集训,金华
来源: https://blog.csdn.net/qq_44341728/article/details/97665431