#6569. 演示关卡 (Платформа: демо ниво)

演示关卡 (Платформа: демо ниво)

题目名称:平台:演示关卡 (Платформа: демо ниво)

来源:马其顿编程竞赛(Macedonian Programming Contests)

题目背景

在 2D 平台游戏中,你最初拥有一个位于屏幕上的水平平台,长度为 LL。我们可以将其看作数轴上的区间 [0,L][0, L]。 随后,有 NN 条线段依次从上方落下。每条落下的线段用区间 [A,B][A, B] 表示,它与当前平台的相对位置决定了它的命运:

  1. 粘贴(Stick):如果线段至少有一半的长度位于当前平台的范围内,它就会粘在平台上。
    • 如果线段超出平台左右边界,它会延伸平台的长度。平台的新边界将变为原来的边界与该线段边界的并集。
  2. 坠落(Fall):如果线段有超过一半的长度位于平台左侧以外或右侧以外,它就会从旁边掉下去。
  3. 粉碎(Shatter):如果线段同时超出了平台的左边界和右边界(即左边凸出一部分,右边也凸出一部分),它会破碎消失。

注意:一旦有线段粘在平台上,平台的范围 [Lmin,Rmax][L_{min}, R_{max}] 就会更新。后续下落的线段将以更新后的平台范围作为参考。

输入格式

  • 第一行:两个整数 NN (1N10001 \le N \le 1000) 和 LL (1L10001 \le L \le 1000)。NN 是线段数量,LL 是初始平台的右端点(初始范围为 [0,L][0, L])。
  • 接下来的 NN 行:每行两个整数 AABB (1000A<B2000-1000 \le A < B \le 2000),表示依次落下的线段左右端点。

输出格式

  • 输出一个整数:成功粘在平台上的线段总数。

样例分析

输入:

7 5
2 4
-1 6
-3 3
6 7
1 8
6 7
7 10

执行过程(初始平台:[-0, 5]):

  1. [2, 4]:完全在 [0, 5] 内。粘贴。平台保持 [0, 5]
  2. [-1, 6]:左边凸出 (1<0)(-1 < 0),右边凸出 (6>5)(6 > 5)粉碎
  3. [-3, 3]:总长 6。重合部分为 [0, 3](长 3)。正好是一半。粘贴。平台更新为 [-3, 5]
  4. [6, 7]:完全在 [-3, 5] 右侧。坠落
  5. [1, 8]:总长 7。重合部分为 [1, 5](长 4)。超过一半(3.5)。粘贴。平台更新为 [-3, 8]
  6. [6, 7]:现在完全在 [-3, 8] 内。粘贴。平台保持 [-3, 8]
  7. [7, 10]:总长 3。重合部分为 [7, 8](长 1)。小于一半(1.5)。坠落

结论: 共有 4 条线段成功粘贴。输出 4



版权信息:整理自 Macedonian Programming Contests 往届竞赛题目。