hdu 3511 圓掃瞄線

2021-07-04 00:14:09 字數 1691 閱讀 2848

給n(50,000)個座標系上的圓,xi,yi,ri。

這些圓相互不相交,並且不相切,只有相互無關或者包含的關係。

(這句話保證了掃瞄線的可行性)。

求被最深處的圓被其他圓包含了幾次。

掃瞄線學習心得

這個部落格寫的好,通俗易懂。

用set來維護所謂的上下事件點的關係。

優先級別高的處在前面位置。

線的優先順序別的確定是根據y點的大小來判斷的,y越大,優先順序越高。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using

namespace

std;

const

int maxn = 50000 + 10;

const

int inf = 0x3f3f3f3f;

const

double eps = 1e-8;

//const

int up = 0;

const

int down = 1;

const

int in = 0;

const

int out = 1;

//int nowlinex;

struct circle

int getx(int tag)

double gety(int tag)

} circle[maxn];

int linenum;

struct line

bool

operator

< (const line &b)const

} line[maxn << 1];

struct node

node(int _id, int _tag)

bool

operator

< (const node &b)const

};set

lines;

set::iterator st, ed, it;

void scanline()

else

//有上下方事件點

else

//上下方事件點不屬於同乙個圓

//情況1:取上下方事件點深度大的

//情況2:上下方事件點深度相同

else

}lines.insert(node(line[i].id, down));}}

}int main()

sort(line, line + linenum);

scanline();

int ans = 0;

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

printf("%d\n", ans);

}return

0;}

HDU 3511 圓的掃瞄線

題意 給了n n 50000 圓的圓心座標和半徑,任意兩個圓不會相切或者相交,也就是說只存在內含和相離兩種關係,問最深的那個圓被巢狀了多少次。題解 抄的別人的。然後自己還不會nlogn的實現。後來看別人 發現,set用的太神了!比較函式中有乙個變數,但是這個變數的改變並不會影響set的形態!所以不會...

POJ 2932 圓掃瞄線

求n個圓中沒有被包含的圓。模仿掃瞄線從左往右掃,到左邊界此時如有3個交點,則有3種情況,以此判定該圓是否被離它最近的圓包含,而交點和最近的圓可以用以y高度排序的set來維護。因此每次到左邊界插入該圓,找該圓最近的兩個圓 上方和下方 判斷是否包含,到右邊界則從set中刪除該圓。date 2017 08...

hdu4007 線段樹掃瞄線

用變長為r的正方形最多能框住幾個點,線段樹,離散化,掃瞄線,延時標記lz include include include include include define n 2005 define inf 1 30 const double eps 1e 12 const double pi acos...