去题面的传送门
看上去一道模拟,应该不难。但是有很多细节要处理,调试了很长时间才过。
①线段的端点不算作线段的一部分。也就是说在判断一条线段的横坐标跨度是否包含水滴的横坐标时,不能加等于号。
②如果水滴在一个轨道上滑落时于另一个轨道相交,水滴将沿着原轨道下滑,不受影响
③若其中一个轨道的端点恰好和另一个轨道相交,如样例中,由于端点是不包含在内的,所以相当等于水滴瞬间滑落到另一个轨道上
④如果单纯按每条线段的最低点排序,会出bug。所以在按最低点排序之后,每次还要枚举一下,看看比这条线段的最低点还要低的线段在这个横坐标时的纵坐标值是否大于此时它的纵坐标值。对于某一个轨道,所有的最低点比它的最低点高的线段,都一定不会是水滴从它滑下后的下一个轨道
⑤还有一点,既然按较低一端的纵坐标排序,在读入时把较低的端点的坐标都标记为(x1,y1)或(x2,y2)就好了
具体看代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>