線段樹對面積的劃分 HDU 1541

2021-06-15 06:56:25 字數 2318 閱讀 9842

題目大意是對給定的很多矩形,求出面積和,重疊的部分只能算一次

可以對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...