題目鏈結
資料範圍較小,直接離散後暴力。等等學習一下線段樹的思路。
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6#define n 101
7#define eps 1e-6
8double
xr[n],xc[n],yr[n],yc[n];
9double x[3*n],y[3*n];
10int dblcmp(double
x)11
16int
main()
1732 r = c = 0
;33 sort(x,x+2*n);
34 sort(y,y+2*n);
35for(i = 1;i < 2*n;i ++)
3641
for(i = 1;i < 2*n;i ++)
4247
for(i = 0;i < r;i ++)
4856
if(k != n) ans += (x[i+1]-x[i])*(y[j+1]-y[j]);57}
58}59 printf("
test case #%d\ntotal explored area: %.2lf\n\n
",cas++,ans);60}
61return0;
62 }
線段樹版本主要是看的以下的部落格。
後乙個部落格的圖很不錯。hh解釋很好,就是把矩形分為上邊和下邊,從下到上,掃瞄。cnt記錄區間下邊比上邊多幾條,sum記錄存在的長度。一段一段的更新,然後計算即可。
2013-06-20
1 #include 2 #include 3 #include4 #include 5
using
namespace
std;
6#define maxn 5000
7#define lson l , m, rt<<1
8#define rson m+1, r,rt<<1|1
9double
que[maxn];
10double
sum[maxn];
11int
cnt[maxn];
12struct
node
1317 node(double a,double b,double c,int
d):lx(a),rx(b),y(c),s(d){}
18bool
operator
< (const node &s) const
1922
}mat[maxn];
23int bin(double x,int
n)24
37return
mid;38}
39void pushup(int rt,int l,int
r)40
48void update(int l,int r,int c,int l,int r,int
rt)49
56int m = (l+r)>>1;57
if(l <=m)
58update(l,r,c,lson);
59if(r >m)
60update(l,r,c,rson);
61pushup(rt,l,r);62}
63int
main()
6479 sort(que,que+num);
80 sort(mat,mat+num);
81int k = 1;82
for(i = 1;i < num;i ++)
8387
double ans = 0
;88 memset(cnt,0,sizeof
(cnt));
89 memset(sum,0,sizeof
(sum));
90for(i = 0;i < num-1;i ++)
9198 printf("
test case #%d\ntotal explored area: %.2f\n\n
",cas++,ans);99}
100return0;
101 }
POJ1151 Atlantis 矩形切割
給出n個矩形,求這些矩形面積的並。輸入包含多組測試資料 每組資料的第一行包含乙個整數n 1 n 1000 表示矩形的個數。接下來n行,每行四個數 不一定是整數 x1,y1,x2,y2 0 x1最後一行以0作為檔案的結束。對於每組測試資料,輸出兩行 第一行是 test case k k是組數 開始為1...
離散化 蠻力 POJ 1151 Atlantis
題意 求矩形面積並 分析 本來是要學習掃瞄線的,不過還沒看懂。囧。在看了黑書之後,發現這題資料規模如此小 100個矩形 於是yy出了一種方法 1.首先把x,y座標都進行離散化。2.離散化之後,將整個平面劃分成很多面積不等的小矩形。3.列舉每個大矩形,得到大矩形離散化後的左上角點和右下角點的位置。4....
POJ1151 Atlantis 掃瞄線演算法
給出幾個矩形對角端點座標,求這些矩形整體覆蓋的面積。整個平面被每個矩形的水平邊所在直線 以後簡稱 水平線 分成了幾個部分,而整體覆蓋面積則為每相鄰的兩個水平線間夾的長度 以後簡稱 夾長 以及水平線所對應的乙個或幾個矩形水平邊 以後簡稱 水平線段 在水平線中所佔的長度之積的和。於是我們假設有乙個掃瞄線...