题目链接
做法
我们每加入一条直线,那么它下方的直线就看不到了。所以最后能看到的形状一定是一个下凸壳。
所以我们先按斜率从小到大排序。
用一个单调栈维护每一段凸壳是哪一条直线,以及这一段凸壳的左端点。
每次加入一条新的直线,如果这条直线与目前栈顶的这条直线的交点,小于这段凸壳的左端点,那么栈顶这条直线一定不在凸壳上了,从栈中弹出。
最后加入我这条直线就行了。
至于精度问题,博主在算交点的时候,用两个整数来表示这个交点的分子和分母,存的时候也存两个整数,就能解决了。
代码
1 |
|
Never waste talents
我们每加入一条直线,那么它下方的直线就看不到了。所以最后能看到的形状一定是一个下凸壳。
所以我们先按斜率从小到大排序。
用一个单调栈维护每一段凸壳是哪一条直线,以及这一段凸壳的左端点。
每次加入一条新的直线,如果这条直线与目前栈顶的这条直线的交点,小于这段凸壳的左端点,那么栈顶这条直线一定不在凸壳上了,从栈中弹出。
最后加入我这条直线就行了。
至于精度问题,博主在算交点的时候,用两个整数来表示这个交点的分子和分母,存的时候也存两个整数,就能解决了。
1 | #include<cstdio> |