这两天半,简单学习了一下cdq分治,先膜一膜cdq。
随便写点东西。
分治算法
分治算法顾名思义,分而治之。
分成若干个子问题,然后得到原问题的解。
cdq分治
理解
有一些问题,可能是修改或者询问。我们不妨把问题分成两部分,先计算好前一半,再计算好后一半,最后再计算前一半修改对后一半询问的影响。
大概思路就这样。
练习
我也就随便做了三个水题。
三维偏序问题
Description
有$ n $个元素,第$ i $个元素有$ a_i $、$ b_i $、$ c_i $三个属性,设$ f(i) $表示满足$ a_j \leq a_i $且$ b_j \leq b_i $且$ c_j \leq c_i $的$ j $的数量。
对于$ d \in [0, n) $,求$ f(i) = d $的数量
Solution
先求$f(i)$。
可以先按$x$排序,这样要求就少一维了。
然后再分治的时候,由于只要分别保证左半边和右半边有序,归并排序掉$y$,用权值BIT维护$z$即可。
注意重复的点。
BZOJ2716天使玩偶
Description
平面坐标系上的一个点集,支持加点,并且询问点集中离某个位置曼哈顿距离的最小值。
Solution
假设询问的点全在给出位置的左下方。
这样只要维护点集$x_i + y_i$的最大值就好了。
轴对称变化,一共做4次。
她也许再也不会教我做题了吧。
|
|
CQOI2011动态逆序对
Description
给出$n$的一个排列,在排列中删除一些数,求每次删除前序列的逆序对数量。
这种只有删除的通常都变成增加来做。
注意,增加一个数,会对前面和后面的都有影响,所以需要后面轴对称变化一下再做一次。
通常逆序对问题都是要long long的。