1007 HNOI2008 水平可見直線

2022-05-18 15:50:40 字數 737 閱讀 7497

先對a排序,a相等的話就對b排序;

維護乙個棧,每次取棧的頭兩個,和當前的直線相比較;

如果當前的直線把頭第乙個遮蔽,就將他出棧,一直到不能遮蔽為止;

**:

#include#include

#include

#define maxn 500005

using

namespace

std;

intst[maxn],top;

intnum[maxn];

struct

line

} l[maxn];

bool check(int x,int y,int

z)int

main()

sort(l+1,l+n+1

);

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

if(top==0||l[st[top-1]].a!=l[i].a)

st[top++]=i;

}int cnt=0

;

for(int i=0; i)

num[cnt++]=l[st[i]].id;

sort(num,num+cnt);

for(int i=0; i)

printf(

"%d

",num[i]);

puts(

"");

return0;

}

view code

1007 HNOI2008 水平可見直線

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

1007 HNOI2008 水平可見直線

因為要求的是從上方看下來可以看到的直線 畫一下圖可以發現能看見的是上邊的乙個下凸殼 然後就單調棧維護一下斜率就好了 include include include include using namespace std const int n 5e4 5 int n struct line l n ...

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