題目大意是對給定的很多矩形,求出面積和,重疊的部分只能算一次
可以對x和y座標進行離散化,然後對面積進行劃分,劃分成四部分,左上,右上,左下,右下
與之前的線段式線段樹不同的是,每次對寬和高進行等分的時侯,xmid和ymid在各部分出現的時候不用+1,因為這裡算的是面積,面積是連續的
注意浮點數的判斷大小
對於x,y是否相等,只有在x+0.000001 > y && x - 0.000001 < y時成立
對於x對於x<=y,只有在x-0.000001
我的**
#includestruct node
node[1000001];
double x[201], y[201];
int xnum, ynum;
double area[101][4];
int n;
double max(double a, double b)
double min(double a, double b)
bool smaller(double a, double b)
bool biger(double a, double b)
int equal(double a, double b)
int sort(double *array, int& num)
} }for(i = 1; i < num; i ++)
for(j = i + 1; j <= num; j ++)
}return 0;
}int build(int xleft, int xright, int yup, int ydown, int pre)
int overlay(double l, double r, double u, double d, double l1, double r1, double u1, double d1, double *over)
over[0] = max(l, l1);
over[1] = min(r, r1);
over[2] = min(u, u1);
over[3] = max(d, d1);
if(smaller(over[1], over[0]))
return 0;
if(smaller(over[2], over[3]))
return 0;
return 1;
}int insert(double l, double r, double u, double d, int pre)
if(!node[pre * 4].flag && overlay(l, r, u, d, x[node[pre * 4].left], x[node[pre * 4].right], y[node[pre * 4]. up], y[node[pre * 4].down], over))
if(!node[pre * 4 + 1].flag && overlay(l, r, u, d, x[node[pre * 4 + 1].left], x[node[pre * 4 + 1].right], y[node[pre * 4 + 1]. up], y[node[pre * 4 + 1].down], over))
if(!node[pre * 4 + 2].flag && overlay(l, r, u, d, x[node[pre * 4 + 2].left], x[node[pre * 4 + 2].right], y[node[pre * 4 + 2]. up], y[node[pre * 4 + 2].down], over))
if(!node[pre * 4 + 3].flag && overlay(l, r, u, d, x[node[pre * 4 + 3].left], x[node[pre * 4 + 3].right], y[node[pre * 4 + 3]. up], y[node[pre * 4 + 3].down], over))
node[pre].area = node[pre * 4].area + node[pre * 4 + 1].area + node[pre * 4 + 2].area + node[pre * 4 + 3].area;
return 0;
}int main()
sort(x, xnum);
sort(y, ynum);
build(1, xnum, ynum, 1, 1);
for(i = 1; i <= n; i ++)
printf("test case #%d\ntotal explored area: %.2lf\n\n", ++ ca, node[1].area);
} return 0;
}
hdu 1255 覆蓋的面積 線段樹
記錄3個變數。sum i 當前區間被覆蓋2次及兩次以上的面積。num i 當前區間被覆蓋1次及一次以上的面積。cover i 覆蓋的lazy標記。對於每乙個區間.更新操作如下 void push up int now if cover rt 1 if cover rt 2 那麼剩下的問題就是簡單的區...
hdu 1255 覆蓋的面積(線段樹求面積交)
給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...
HDU 1255 覆蓋的面積(線段樹求矩形面積交)
題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...