POJ1151基本的扫描线求面积
生活随笔
收集整理的這篇文章主要介紹了
POJ1151基本的扫描线求面积
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給定n個矩形的對角坐標,分別是左下和右上,浮點型,求矩形覆蓋的面積。
思路:
? ? ?給定n個矩形的對角坐標,分別是左下和右上,浮點型,求矩形覆蓋的面積。
思路:
? ? ? 基本的線段樹掃描線求面積,沒有坑點,不解釋了,提示一點,有的題尤其是線段樹掃描線的題需要離散化的時候建議二分去找,別map,記得之前map超時過很多次,但不是針對這個題目,這個題數據量不大,怎么都行,發現codeblock這個編譯器定義宏然后在定義結構體的時候變量名字相同導致編譯不過去,我之前用的DEV也是這么寫的,記得能編譯過去,不知道為啥。
#include<stdio.h> #include<string.h> #include<algorithm>//#define l ,mid ,t << 1 //#define mid ,r ,t << 1 | 1 #define N 105using namespace std;typedef struct {double l ,r ,h ,mk; }EDGE;double num[105*2*2] ,tmp[105*2*2]; double len[105*2*2*4]; int cnt[105*2*2*4]; EDGE E[105*2];bool camp(EDGE a ,EDGE b) {return a.h < b.h || a.h == b.h && a.mk < b.mk; }void PushUp(int l ,int r ,int t) {if(cnt[t]) len[t] = num[r] - num[l];else if(l + 1 == r) len[t] = 0;else len[t] = len[t<<1] + len[t<<1|1]; }void Update(int l ,int r ,int t ,int a ,int b ,int c) {if(a == l && b == r){cnt[t] += c;PushUp(l ,r ,t);return ;}int mid = (l + r) >> 1;if(b <= mid) Update(l,mid ,t << 1 ,a ,b ,c);else if(a >= mid) Update(mid ,r ,t << 1 | 1 ,a ,b ,c);else{Update(l ,mid ,t << 1 ,a ,mid ,c);Update(mid ,r ,t << 1 | 1 ,mid ,b ,c);}PushUp(l ,r ,t); }void BuidTree() {memset(cnt ,0 ,sizeof(cnt));memset(len ,0 ,sizeof(len));return ; }int search2(double now ,int n) {int low = 1 ,up = n ,mid ,ans;while(low <= up){mid = (low + up) >> 1;if(now <= num[mid]){ans = mid;up = mid - 1;}else low = mid + 1;}return ans; }int main () {int i ,n ,id ,cas = 1;double x1 ,y1 ,x2 ,y2;double Ans;while(~scanf("%d" ,&n) && n){for(id = 0 ,i = 1 ;i <= n ;i ++){scanf("%lf %lf %lf %lf" ,&x1 ,&y1 ,&x2 ,&y2);E[++id].l = x1;E[id].r = x2 ,E[id].h = y1 ,E[id].mk = 1;tmp[id] = x1;E[++id].l = x1;E[id].r = x2 ,E[id].h = y2 ,E[id].mk = -1;tmp[id] = x2;}sort(E + 1 ,E + id + 1 ,camp);sort(tmp + 1 ,tmp + id + 1);int n2 = n * 2;for(id = 0 ,i = 1 ;i <= n2 ;i ++){if(i == 1 || tmp[i] != tmp[i-1])num[++id] = tmp[i];}BuidTree();E[0].h = E[1].h;Ans = 0;for(i = 1 ;i <= n2 ;i ++){Ans += len[1] * (E[i].h - E[i-1].h);int l = search2(E[i].l ,id);int r = search2(E[i].r ,id);Update(1 ,id ,1 ,l ,r ,E[i].mk);}printf("Test case #%d\n" ,cas ++);printf("Total explored area: %.2lf\n\n" ,Ans);}return 0;}
總結
以上是生活随笔為你收集整理的POJ1151基本的扫描线求面积的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4038贪心(最快上升倍率,好题)
- 下一篇: POJ1178枚举三个地方(所有点都去同