cdq分治是一种具体的思想,主要用于一下几种情形中:
1.解决和点对有关的问题
摘自 oi-wiki ,简言之,我们就是分治处理点对,重点在如何处理横跨mid的点对
【例题】P3810 【模板】三维偏序(陌上花开)
我们首先按照x维度排序,然后问题就变成二维了,然后我们递归处理(l,mid)和(mid+1,r)内的点对,然后处理横跨mid的点对,我们把左半部分和右半部分按照y维度排序,这样就可以双指针了,利用树状数组查询,设右半部分的指针为i,左半部分的指针为j,如果y[j]<=y[i]那就不断把z[j]加入树状数组,然后询问小于等于z[i]的个数即可 代码
【练习】P3157 [CQOI2011]动态逆序对
经典的三位偏序问题 代码
2.用于斜率优化dp
当x和k均不单调时,我们需要用splay去维护下凸壳,或者是从cdq分治来解决这个问题
我们分治处理[l,r]的区间时,可以利用归并排序将[l,mid]维护成x单调,[mid+1,r]维护成k单调,这样问题就回归成了我们熟悉的斜率优化dp,可以直接通过单调栈+单指针往后走即可
P4655 [CEOI2017]Building Bridges
很裸的斜率优化,直接套用cdq斜率优化dp即可 代码