题解 CF983D Arkady and Rectangles

link

题意

平面直角坐标系上给定 n 个矩形,第 i 个矩形颜色为 i,颜色大的矩形将覆盖颜色小的矩形,问最后能看到几种颜色。

1n105,|xi|,|yi|109

题解

首先离散化,考虑扫描线如何维护序列上的颜色。

一个区间 [l,r] 投射到线段树上 O(logn) 个不交区间,总共 O(nlogn) 个。对于每个区间,直接把每种颜色塞到一个 set 里,当前区间可能被看到的颜色只会是 set 最大值,记为 vx

考虑只插入怎么做,发现 i 处的颜色即线段树上根节点到 [i,i] 路径上每个 vxmax,那我在一个被颜色 c 完全覆盖的区间 [l,r] 上,若根到 [l,r] 路径上的 maxvx 小于 c,且存在该节点到某一叶节点的路径 maxvx 也小于 c,说明 c 可被看到,于是在线段树上维护 mnx 表示所有 x 到叶节点的路径 maxvx 的最小值,即可 O(1) 判断,每次最多增加 1 个新颜色。

现在加入删除操作,一个区间的删除可能会增加更多可被看到的颜色,但答案最多 O(n) 个,那我设法只考虑没被看过的颜色,用 mxx 表示以 x 为根的子树,没被统计过且可能会被看见的最大颜色,从 [l,r] 中删掉颜色 c,重新计算 vx。pushup 时先继承左右儿子,考虑 vxmnxmxx 的贡献,分两种情况:

  • vx 已被统计过,mnxmax(mnx,vx)

  • vx 未被统计过,mxxmax(mxx,vx)

mnx>mxx,即当前区间可能会被看见的最大颜色比 [l,r] 中已被看见的最小颜色还小,越往上走 mnx 只增不减,自然看不见 mxx 了,令 mxx0

mx10,说明出现了一种从未被看见的颜色被看到了,标记为已看见,并把 mx1 对应的 O(logn) 个区间拉出来修改信息。若修改后 mx1 仍不为 0,就继续修改,直到 mx1=0。因为最多只有 n 个颜色,所以总修改次数最多 n 次。

线段树一个 log,set 一个 log,时间复杂度 O(nlog2n)

posted @   Terac  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示