CF #487 (Div. 2) D. A Shade of Moonlight 构造_数形结合

探讨了给定多个互不相交的开区间及其移动速度,如何通过调整速度使区间覆盖原点的问题。采用二分搜索与时间复杂度为O(nlogn)的算法解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
nnn个长度为 lll 且互不相交的开区间 (xi,xi+l)(x_{i}, x_{i}+l)(xi,xi+l) ,每个区间有一个移动速度 vvvv∈1,−1v∈1,-1v1,1。你可以在某一时刻给所有区间同时增加一个速度 www,要求满足 ∣w∣&lt;=wmax|w|&lt;= w_{max}w<=wmax
求有对多少对 (i,j)(i&lt;j)(i,j)(i&lt;j)(i,j)(i<j) 移动的过程中能同时覆盖原点(坐标为 000 的点)。
数据·范围:
( n&lt;=105n&lt;=10^5n<=105) (l,wmax&lt;=108l,w_{max}&lt;=10^8l,wmax<=108).

看图说话:
在这里插入图片描述

我们设图中的横坐标为原坐标系中的横坐标,纵坐标代表时间。

蓝色柱子代表一个区间所覆盖的轨迹,黄色区域为原点移动所能覆盖的地方。

显然,两个区间的相互重叠部分与原点重合当且仅当两个蓝色柱子在黄色区域处有公共部分。

我们可以将所有区间分为2类,1.速度为1,即向右移动的区间。2.速度为-1,即向左移动的区间,并分别将这些区间排序,依次枚举向右移动的区间,在向左移动的区间中进行二分。因为 wmax&gt;=1w_{max}&gt;=1wmax>=1,所以我们要找到一个符合要求的初始横坐标最小的一个。至于如何判断任意两条蓝柱和黄色区域是否有交点,我们只需拿出两条蓝色柱子最靠外的两条直线,求交点,并将交点的横坐标带入到黄色区域边缘的直线上,看带而得出的纵坐标的大小是否小于等于带入求出的蓝线交点的纵坐标即可。时间复杂度为O(nlogn)O(nlogn)O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值