「分治」-cdq分治
cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问 题),还可以优化1D/1D类型的DP。 • 算法的大体思路我们可以用点对来描述。假定我们有一个长度为n的序列,要处理序列中元素点对间的关系。定义一个操作cdq(l,r)表示当前处理序列上区间[L,R]的点对关系。那么我们需要找到[L,R]的中点M,将不同的点对分为三类: • A:两个点都在区间[L,M]上 • B:两个点都在区间[M+1,R]上 • C:两个点分别在[L,M]和[M+1,R]上。 对于前两种情况,分别用cdq(L,M),cdq(M+1,R)解决,也就是甩锅给下一层。 对于第三种情况,我们需要想方设法在当前层的cdq(L,R)中解决。 在解决当前层的问题时,利用已经处理好的左右两边的信息,具体视不同题目而 定。 其实,这样的算法很帅! 例题: A. 陌上花开 题目描述 有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。 定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。 这道题就是一道裸的cdq模板题,但是对于初学的菜鸡(就是我)来说还是异常的艰难,我们知道对于普通的二维偏序问题