HNOI 2008 水平可見直線

2021-06-21 22:56:28 字數 1114 閱讀 3407

hnoi 2008 水平可見直線

在 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

從小到大輸出可見直線的編號,兩兩中間用空格隔開。 

-1 0 

1 0 

0 0

1 2 

n<50000

本題題解三部曲:

一部曲:以k為第一關鍵字,b為第二關鍵字,進行排序。

二部曲:構建關於直線的單調棧。

三部曲:整理並輸出答案。

就這麼簡單。

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

#define n 50000 + 5

int n, s[n], t[n];

struct line

bool operator < (const line a) const

}h[n];

void begin()

double dotx(line u, line v)

void work()

for (int i = 1; i <= s[0]; i ++)

t[i] = h[s[i]].num;

sort(t + 1, t + s[0] + 1);

}void end()

int main()

HNOI 2008 水平可見直線

傳送門 題目描述 在 xo yxoy xoy 直角座標平面上有 n nn 條直線 l1,l2,l nl 1,l 2,l n l1 l2 ln 若在 y yy 值為正無窮大處往下看,能見到 l il i li 的某個子線段,則稱 l il i li 為可見的,否則 l il i li 為被覆蓋的。例如...

HNOI2008 水平可見直線

luogu 給定若干條直線 都是 y ax b 的形式 求從上往下看所有可以看到的直線,從小往大輸出編號 n le 50000 a b le 500000 從上往下看,若干條直線構成的半平面交的部分才是可見的 聽說直接做半平面交可以 o n log n 做,但是我不會 y kx b 對於乙個 x 只...

HNOI2008 水平可見直線

傳送門 這道題我自己想了想 不過並沒有想出什麼很好的方法。我們簡單一點考慮,問題可以轉化成求所有在最上面的直線的那個集合中有哪些直線。我們知道斜率最大 接近正無窮 和斜率最小 接近負無窮 的是肯定要被保留下來的,而且還是在最兩側的兩條直線。那麼對於一般的直線,我們考慮一下。如上圖,這兩條直線都是可見...