[BZOJ 2658]小蓝的好友

荒凉一梦 提交于 2020-01-28 13:46:50

一、题目

在这里插入图片描述

二、解法

正难则反,求至少包含一个黑格子就等于全部减去不包含黑格子的方案数。

考虑单调栈,对于每一行,求出每一个点最长上升,不碰到黑格子的距离,得到一个数组upup,本题的一个重要条件是数据随机,我们对upup数组建立treaptreap,其中下标作为减值,upup作为修正值,这样建出来的数满足根节点的upup最小,而且由于upup随机,能够保证复杂度是log\log

考虑每个点的贡献,就是在treaptreap中的:(up[x]up[fa[x]])×size[x]×(size[x]+1)÷2(up[x]-up[fa[x]])\times size[x]\times (size[x]+1)\div 2,求和即可。

怎么理解上式呢?请看下图:
在这里插入图片描述
就比如这样的一颗局部treaptreap,我们的根通过上式处理了红色部分的贡献,具体表现为固定yy轴下限,在高度差中随意选取yy轴上限,左边和右边都在管辖范围(upup一定比它大)中乱选(也就是sizesize),体现为等差数列求和,那我们每一个高度都不重不漏的统计,那么一直归纳到最后,就可以发现这种做法的正确性,所以当行的答案我们解决了。

将改行转移到下一行,每一个up+1up+1,如果遇到了黑色点那就清零,时间复杂度O(nlogn)O(n\log n)

没有代码,需要填坑
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!