【题解】P4898 [IOI2018] seats 排座位

思路

线段树。

题意可以转化成每次判定有多少个前缀满足所有结点构成矩形。

首先排除确定矩阵坐标再数答案的做法,因为太难。

所以考虑如何对前缀进行判定。

一个简单的想法是维护前 i 个点中 x,y 坐标的最值,但这样只能暴力看矩阵中的所有元素,跑得很慢。

不妨思考一下合法的条件:

  • i 个点都可以被一个矩形覆盖,这个恒成立。

  • 这个矩形内没有其他的点。

对于 2,考虑把前 i 个点和剩下的点分开,考虑把前 i 个染成黑色,后面的染成白色。

于是现在可以考虑黑白分布情况:

  • 所有的黑点必须连通,等价于左边的相邻点和上边的相邻点都是白点的黑点只有 1 个。

  • 矩形内没有白点,也就是说黑点不会有 L 形的分布,等价于不存在相邻点中有超过一个黑点的白点。

结论不会证,但是是对的,差点猜出来。

不太好维护每个时刻图内的状况。

换个角度,既然每次交换至多影响 10 个点的状态,那直接维护每个点对答案的贡献,每次只需要 O(log) 计算贡献就能做。

先考虑第一个条件。如果点 (x,y) 在时刻 i 是合法的,那么显然有 tx,yi<min(tx1,y,tx,y1).

第二个条件同理有 SecondMin(tx-1,y,tx,y-1,tx+1,y,tx,y+1)i<tx,y.

于是一个点可以贡献的时刻都是确定的,直接对于点动态算贡献就好了。

注意四连通的点处理出来之后要去重,不然就会喜提 56pts.

代码

posted @   kymru  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示
主题色彩