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