吐槽:
今天讲的东西好多啊,虽然比昨天好了点,但是还是一脸懵逼......
分治
分治的思想
将一个区间(或树)分成若干个区间(或子树),以达到优化的目的
例题
现在来两道例题(不是课件上的,但是比课件上的难)
CDQ分治
作用
可以顶替比较复杂的数据结构(如二维,三维线段树),且常熟较小,但是这个东西必须要离线才能够操作
二位偏序
给定N个有序对(a,b),求对于每个(a,b),满足a0 < a且b0 < b的有序对(a0,b0)有多少个
这个题目其实和归并排序差不多,一般都是将一个作为关键字排序,然后用各种数据结构(一般是线段树或树状数组)维护即可
三维偏序
给定N个有序三元组(a,b,c),求对于每个三元组(a,b,c),有多少个三元组(a0,b0,c0)满足a0 < a且b0 < b且c0 < c
首先,我们可以排一个序(按a为第一关键字),然后就可以把b这个东西给消掉,之后我们用归并(也就是分治)把B这个给处理掉,对于c的话,我们就可以用树状数组来做,即可把c给消掉这样就完成了三维偏序(至于代码......还是不会)
四维偏序
就是cdq套cdq——不会......
点分治
原理
将一颗树的重心切开,计算分成多个树的贡献,最后计算有这个点的贡献,以达到优化时间的目地(我乱写的
由于简单的点分治我会了,而且讲的题目我都A了,这里不再说了
图论
说明
对于一些知识点,如spfa,dj这些就不讲了
知识点
判断是否有负环
方法一:判断最短路的边数是否>n
方法二:判断一个点是否入队n次
Prufer序
将⼀棵树变成⼀个序列
每次选择树上标号最小的叶子,删掉它,将与它相连的那个点的标号加到序列列里,直到只剩下 2 个点
好处:一颗树只有一个pruper序,反之同理,而且做法简便,可以用Hash很好的储存(后面的我瞎BB的)
题目
就这样了,下面真的写不下去了