bzoj4237稻草人 cdq分治+栈

不稳定的传送门

总结

这题是看了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在线左侧时,查看“左栈”,如果“左栈”的栈顶的点j的x小于点i的x,就将点j退栈。然后将点i放进“左栈”。最后询问“右栈”中x值比左栈栈顶下一个点x值小的点的数量。
(2)当这个点在 线 <script id="MathJax-Element-154" type="math/tex">线</script>的右侧是,查看“右栈”,如果如果“右栈”的栈顶的点j的x小于点i的x,就将点j退栈。然后将点i放进“右栈“。
③将L~R的点按回x从小到大排序。
④递归L~mid,mid+1~R。

私が覇者となる

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值