p7913-solution

P7913 Solution

link

先考虑有 \(n\) 个廊桥的分配。假设廊桥编号为 \(1\sim n\),我们用两个堆 \(h1,h2\) 分别存当前空闲的廊桥编号和正在使用廊桥的飞机的离开时间。对于国内和国外的飞机分别做一次以下操作:

先按到达时间排序,从左到右扫,到第 \(i\) 架飞机的到达、离开时间为 \(l_i,r_i\) 时:

  • pop 掉 \(h2\) 内所有离开时间 \(<l_i\) 的飞机,同时把它们占的廊桥编号 push 进 \(h1\)

  • 如果 \(h2\) 的大小 \(<n\),将 \(r_i\) push 进 \(h2\),同时将 \(h1\) 中编号最小的廊桥分配给第 \(i\) 架飞机。

容易发现,在仅有 \(k\) 架廊桥的情况下所有一开始分配的廊桥编号 \(>k\) 的飞机都无法进入廊桥。这是因为我们在分配时每次都选择了最小的廊桥编号。

于是接下来就简单了。分别统计一架廊桥被多少架飞机进入过,做一遍前缀和后 \(\mathcal O(n)\) 扫一遍即可。

posted @ 2024-03-04 20:47  iorit  阅读(14)  评论(0)    收藏  举报