先對a排序,a相等的話就對b排序;
維護乙個棧,每次取棧的頭兩個,和當前的直線相比較;
如果當前的直線把頭第乙個遮蔽,就將他出棧,一直到不能遮蔽為止;
**:
#include#includeview code#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;
}
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 且...