Description
题目链接:Codeforces 555B
有 $n$ 个狭窄的岛屿排成一排的群岛,我们将他们表示为直线上不相交的线段:岛屿 $i$ 的坐标为 $[l_i,r_i]$。保证对于所有的 $1\le i\le n-1$,都有 $r_i<l_{i+1}$。
你需要在所有相邻的岛屿之间架上桥梁。一座长度为 $a$ 的桥可以架在第 $i$ 和 $i+1$ 个岛屿之间,当且仅当存在 $l_i\le x\le r_i$,$l_{i+1}\le y\le r_{i+1}$ 满足 $y-x=a$。
现在你有 $m$ 座桥梁,第 $i$ 座桥梁的长度为 $a_i$,并且每座桥梁最多只能使用一次。请问是否可以把任意两个相邻的岛屿连通。如果可行,输出 Yes
和方案;否则输出 No
。
数据范围:$2\le n\le 2\times 10^5$,$1\le m\le 2\times 10^5$,$1\le l_i\le r_i\le 10^{18}$,$1\le a_i\le 10^{18}$
Solution
我们先求出相邻两个岛屿之间能架的桥的长度区间,显然对于岛屿 $i,i+1$,长度区间为 $[l_{i+1}-r_i,r_{i+1}-l_i]$,记为 $[s_i,t_i]$。这就是说,我们要对每个 $i\in [1,n)$,配上一个 $a_j$ 满足 $s_i\le a_j\le t_i$。
考虑贪心策略:把所有的长度区间按照右端点为第一关键字,左端点为第二关键字,从小到大排序。对于第 $i$ 个区间,我们找到第一个不小于 $s_i$ 的 $a_j$ 与其配对。如果出现无解情况(找不到不小于 $s_i$ 的值,或者 $a_j>r_i$)就直接退出。这个过程可以通过 $\text{set}$ 实现。
时间复杂度:$O(n\log nm)$
Code
1 |
|