1007 HNOI2008 水平可見直線

2021-07-17 03:26:59 字數 1938 閱讀 8224

time limit: 1 sec  

memory limit: 162 mb

submit: 5879  

solved: 2238 [

submit][

status][

discuss]

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

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

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

3-1 0

1 00 0

1 2

[ submit][

status][

discuss]

加一條直線y = inf

做一遍半平面交,剩下的半平面就是ans啦

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 5e4 + 50;

typedef double db;

const db eps = 1e-10;

const db inf = 1e12;

const db xa = -233;

const db xb = 233;

struct point

point(db x,db y): x(x),y(y){}

point operator - (const point &b)

point operator * (const db &b)

point operator + (const point &b)

}sec[maxn];

typedef point vector;

struct line

line(point p,vector v,int num): p(p),v(v),num(num)

bool operator < (const line &b) const

}line[maxn],q[maxn];

int n,cnt;

bool mark[maxn];

db cross(vector v1,vector v2)

bool onleft(line k,point po)

point getintersection(line l1,line l2)

int main()

int head,tail; sort(line,line + cnt);

q[head = tail = 0] = line[0];

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

if (head < tail) sec[tail-1] = getintersection(q[tail],q[tail-1]);

} while (head < tail && !onleft(q[head],sec[tail-1])) --tail;

for (int i = head; i <= tail; i++) mark[q[i].num] = 1;

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

if (mark[i]) printf("%d ",i);

return 0;

}

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

1007 HNOI2008 水平可見直線

先對a排序,a相等的話就對b排序 維護乙個棧,每次取棧的頭兩個,和當前的直線相比較 如果當前的直線把頭第乙個遮蔽,就將他出棧,一直到不能遮蔽為止 include include include define maxn 500005 using namespace std intst maxn top...