BZOJ 1007 水平可見直線 幾何 半凸包

2021-08-07 12:35:02 字數 720 閱讀 2306

題意:在xoy直角座標平面上有n條直線l1,l2,...ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.

例如,對於直線:

l1:y=x; l2:y=-x; l3:y=0

則l1和l2是可見的,l3是被覆蓋的.

給出n條直線,n<=5e4,表示成y=ax+b的形式(|a|,|b|<=500000),且n條直線兩兩不重合.求出所有可見的直線.

斜率相同的 只保留截距大的.剩下的按斜率從小到大排序.

若斜率小的i和斜率大的j交點為(x,y) 則在(-inf,x]直線i蓋住j,在[x,inf)直線j蓋住i.

用棧來維護 求出當前待插入點和棧點交點x座標,以及棧頂和次棧頂交點的x座標來確定棧頂是否被覆蓋.

答案是正確的,因為最後棧中的直線形成乙個斜率遞增的半凸包. 

#include using namespace std;

typedef long long ll;

const double eps=1e-8;

const int n=5e4+20;

struct datal[n];

int n;

bool cmp(data a,data b)

s[++top]=a;

}int ans[n];

void work()

int main()

BZOJ 1007 水平可見直線

題意 給出一些直線。從y軸正方向無窮遠處向下看能看到哪些?思路 如下圖,首先將直線按照斜率公升序排序,我們維護乙個單調的棧,棧頂top,設x i,j 表示i和j直線交點的橫座標,那麼x top,top 1 x i,top 時top可以被top 1和i完全覆蓋。比如下圖,首先我們將1和2壓入棧中。對於...

bzoj1007 水平可見直線

在xoy直角座標平面上有n條直線l1,l2,ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.例如,對於直線 l1 y x l2 y x l3 y 0 則l1和l2是可見的,l3是被覆蓋的.給出n條直線,表示成y ax b的形式 a b 500000 且...

BZOJ1007水平可見直線 凸包

在xoy直角座標平面上有n條直線l1,l2,ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.例如,對於直線 l1 y x l2 y x l3 y 0 則l1和l2是可見的,l3是被覆蓋的.給出n條直線,表示成y ax b的形式 a b 500000 且...