不稳定的传送门
总结
这题是看了Kscla大神的博客才做这一题。因为我的总结是写给我自己看的,如果想看比本蒟蒻更好的总结请点链接..
首先先总结一下cdq分治:
①cdq分治和整体二分一样,都是只能解决离线问题。
②听别人说整体二分是二分答案,cdq分治是二分过程,可能是我做的题比较少,我觉得两者的核心都差不多,都是将操作和询问进行二分,(对于cdq分治来说,就只有操作)接着计算前一半的操作对后一半操作的影响。(对于整体二分来说,只要算前一半操作对后一半询问的贡献)总体来说,以我现在的知识储备,我认为整体二分和cdq分治想法的核心是相似的。
③cdq分治所处理的问题贡献是相对独立的。
接着总结一下这一题:
一开始我看到Kscla大神的博客中的cdq分治+单调栈时,我想能不能用不是栈的数据结构来搞(比如线段树),然后想了一下线段树的维护方式。首先无论用什么方法(暴力),都需要用排序来降一下维(例如对于x排序),然后分治,我(一点也不)惊奇地发现对于每个新增的点,它在它那一列每个位置所能贡献的权值是相对固定的,如果我能用线段树维护出各个区间,那我连分治都不需要了。但我分析了一下(一天),线段树好像维护不了。。
正文
于是乎便是cdq分治,例如现在有n个点已经按照x从小到大排序,比如说我们现在要求下标(不是x)L~R的点的贡献,现在二分到一个点mid,然后求L~R这些点里面经过X[mid]这条 线 的矩形的数量。
彩蛋
上面就是cdq分治的主要思想,作为一道总结cdq分治的题,写到上面正文就该结束了。接下来是彩蛋。(彩蛋比正文长)
①将L~R的点按y从大到小排序。
②依次处理每个点i,
(1)当这个点i在
(2)当这个点在
线
<script id="MathJax-Element-154" type="math/tex">线</script>的右侧是,查看“右栈”,如果如果“右栈”的栈顶的点j的x小于点i的x,就将点j退栈。然后将点i放进“右栈“。
③将L~R的点按回x从小到大排序。
④递归L~mid,mid+1~R。