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