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