#P16602. [GCPC2021]Flappy Bird

[GCPC2021]Flappy Bird

题目描述

请帮助小鸟 Faby 穿过依次排列的 nn 对管道,并找到一条到达终点的最短飞行路线。

为简化问题,将 Faby 看作平面上的一个点,并假设每根管道的宽度均为 00。于是,每对管道之间的缺口可以表示为位于某个横坐标处的一条竖直线段。

小鸟从点

s=(xs,ys)s=(x_s,y_s)

出发,目标是到达点

t=(xt,yt)t=(x_t,y_t)。

请寻找一条从 sstt 的最短折线路径,使其按照横坐标递增的顺序依次穿过所有给定的竖直区间。

样例 2 示意图

图中红色线段表示需要穿过的区间,黑色折线表示一条最短路径。Faby 和黑点表示样例输出中的点。点 (2,1)(2,1) 也可以被额外输出。

输入格式

输入包含:

  • 第一行四个整数 xs,ys,xt,ytx_s,y_s,x_t,y_t109xs,ys,xt,yt109-10^9\le x_s,y_s,x_t,y_t\le 10^9),表示起点和终点。
  • 第二行一个整数 nn0n1060\le n\le 10^6),表示区间数量。
  • 接下来 nn 行,第 ii 行包含三个整数 xi,yi,1,yi,2x_i,y_{i,1},y_{i,2}109xi,yi,1,yi,2109-10^9\le x_i,y_{i,1},y_{i,2}\le 10^9,且 yi,1<yi,2y_{i,1}<y_{i,2}),表示位于横坐标 xix_i 处、纵坐标范围为 [yi,1,yi,2][y_{i,1},y_{i,2}] 的竖直区间。

保证

xs<x1<x2<<xn<xtx_s<x_1<x_2<\cdots<x_n<x_t。

输出格式

输出一个由 kk 个点组成的序列

p1,p2,,pkp_1,p_2,\ldots,p_k,

其中 2kn+22\le k\le n+2。每行输出一个点的两个整数坐标。

不需要单独输出 kk;直接逐行输出所有点,直至文件结束。

输出必须满足:

  • 所有点的坐标均为整数;
  • p1=sp_1=s,且 pk=tp_k=t
  • 依次连接 pipi+1p_ip_{i+1}1i<k1\le i<k)得到折线路径 PP,则:
    • PP 按横坐标递增的顺序穿过所有给定区间;
    • PP 的总长度最短。

若存在多组合法答案,输出任意一组即可。

样例 1

输入

0 0 10 0
1
5 -10 10

输出

0 0
10 0

样例 2

输入

0 0 10 0
4
2 1 3
4 2 3
7 0 2
9 -2 -1

输出

0 0
4 2
9 -1
10 0