POJ 2932 圓掃瞄線

2022-05-20 10:23:59 字數 1466 閱讀 2234

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

/** @date    : 2017-08-13 17:27:55

* @filename: poj 2932 圓掃瞄線.cpp

* @platform: windows

* @author : lweleth ([email protected])

* @link :

* @version : $id$

*/#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define pii pair#define mp(x, y) make_pair((x),(y))

#define fi first

#define se second

#define pb(x) push_back((x))

#define mmg(x) memset((x), -1,sizeof(x))

#define mmf(x) memset((x),0,sizeof(x))

#define mmi(x) memset((x), inf, sizeof(x))

using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 1e5+20;

const double eps = 1e-8;

int n;

struct circle

circle(double _x, double _y, double _r)

};circle c[n];

pairp[n*2];

int ans[n];

int isinside(int a, int b)

int main()

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

sort(p, p + 2 * n);

set>q;

int cnt = 0;

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

else q.erase(mp(c[p[i].se%n].y, p[i].se%n));

} sort(ans, ans + cnt);

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

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

printf("%d%s", ans[i] + 1, i==cnt-1?"\n":" ");

return 0;

}

POJ 2932 掃瞄線思想

這個題確實太神奇了 大意就是給出了n個互不相交的圓。各個圓之間有可能乙個完全包含了另乙個。這裡包含就是乙個圓整個都被另乙個圓圈再裡面。現在求那些沒有被包含的圓的序號。資料量是4w 所以n2的肯定不行。苦思冥想,不得其解 看了這個之後不由得大呼資料結構之博大精深 大意就是類似於我們經常用的那種掃瞄線,...

poj2932 掃瞄線 平面幾何

挑戰程式設計p258 將圓的x左邊左端和右端儲存起來 for int i 0 i排序 sort events.begin events.end 判斷 在本題中圓只有兩種情況 包含與不包含 for int i 0 i iterator it outers.lower bound make pair y...

poj2932 掃瞄線 平面幾何

挑戰程式設計p258 將圓的x左邊左端和右端儲存起來 for int i 0 i排序 sort events.begin events.end 判斷 在本題中圓只有兩種情況 包含與不包含 for int i 0 i iterator it outers.lower bound make pair y...