BZOJ1007 HNOI2008 水平可見直線

2021-08-18 18:24:14 字數 1215 閱讀 6764

description

在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),且n條直線兩兩不重合.求出所有可見的直線.

input

第一行為n(0 < n < 50000),接下來的n行輸入ai,bi

output

從小到大輸出可見直線的編號,兩兩中間用空格隔開,最後乙個數字後面也必須有個空格

sample input

3 -1 0

1 0

0 0sample output

1 2題解

其實我覺得洛谷上的那篇講的巨詳細有木有。。。

這道題需要求一群直線中最上面的那幾條,我們只需按斜率從小到大排序,開乙個棧。每次加入線段時計算一下它與棧頂直線的交點與棧頂直線與棧下面一條直線交點的位置關係,如果加入直線的交點在左邊,因為我們按斜率排過序,所以新加入的直線肯定是可以覆蓋棧頂直線的,所以棧頂直線退棧。直到棧中直線不滿足上述關係式,加入新直線。

細節注意去掉斜率相同的直線,保留截距最大的就好。

**

#include

using

namespace

std;

const

int m=50005;

struct li;

bool

operator

< (const li &x,const li &y)

double inter(li x,li y)

void in()

void ac()

sort(line+1,line+1+n);

// for(int i=1;i<=tot;++i)

// printf("%d %d %d\n",line[i].k,line[i].b,line[i].id);

for(int i=1;i<=tot;++i)

sort(ans+1,ans+1+top);

for(int i=1;i<=top;++i)

printf("%d ",ans[i]);

}int main()

bzoj1007 HNOI2008 水平可見直線

time limit 1 sec memory limit 162 mb submit 4365 solved 1599 在xoy直角座標平面上有n條直線l1,l2,ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.例如,對於直線 l1 y x l2 y...

bzoj1007 HNOI2008 水平可見直線

在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 且...

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...