給出若干個與軸平行的矩形,求被覆蓋了2次及以上區域的面積
簡述掃瞄線演算法:
下圖3個矩形共有6條掃瞄線,我們只需要計算出相鄰兩條掃瞄線之間的被覆蓋的面積相加即可得到矩形的面積並,實現如下:
(1)對圖中的每條橫邊(豎邊也行)按它的高度從小到大排序
(2)從下到上依次掃瞄每條橫邊(即掃瞄線),計算當前掃瞄線覆蓋的總長度,乘上與上一條掃瞄線之間的高度差即得到它們之間的被覆蓋的面積
(3)第二條掃瞄線覆蓋的長度=第一條橫線的長度+第二條橫線的長度,所以要用線段樹維護當前被覆蓋的總長度,當乙個矩形的上邊掃過後,那麼它底邊的貢獻就沒了,所以對每個矩形的底邊標記為1,上邊標記為-1,方便線段樹維護
(4)涉及到線段樹,一般需要離散化座標,同時將邊權轉化為點權
對於此題,只需要每次計算當前被覆蓋2次及以上的線段長度即可
#include using namespace std;
const int maxn = 1e5+15;
int tg[maxn<<1],n,m;
double x,y,xx,yy,c[maxn],tr2[maxn<<1],tr1[maxn<<1];
/* tg[x]標記線段樹上x節點所代表的區間被完整的覆蓋了多少次
tr1[x]記錄線段樹上x節點所代表的區間被覆蓋了1次的長度
tr2[x]記錄線段樹上x節點所代表的區間被覆蓋了2次及以上的長度
*/struct segements[maxn<<1];
bool cmp(segement a,segement b)
inline void pushup(int x,int l,int r)
else
else tr1[x] = tr1[x<<1] + tr1[x<<1|1];
}}void updata(int l,int r,int l,int r,int x,int op)
int mid = (l+r) >> 1;
updata(l,mid,l,r,x<<1,op);
updata(mid+1,r,l,r,x<<1|1,op);
pushup(x,l,r);
}int main()
sort(c,c+len);
sort(s,s+len,cmp);
int len = unique(c,c+len) - c;
double res = 0.0;
for(int i = 0;i < len; ++i)
printf("%.2f\n",res);
}return 0;
}
hdu 1255 覆蓋的面積
與poj1151略有不同 由於是大於等於2 的有效 所以應該更新到點 include include include include include include include include include includeusing namespace std define inf 0x3f3...
HDU 1255 覆蓋的面積
題目鏈結點這裡 這道題,很久以前做過,當時寫了個暴力,居然過了,然後一直想寫下線段樹的,結果一直被各種事搞得忘了。現在終於填坑了。include include include includeusing namespace std define mem x,y memset x,y,sizeof x...
HDU 1255 覆蓋的面積
題目 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input 輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...