矩形的並和交

2021-06-09 13:38:23 字數 2904 閱讀 7805

給定乙個矩形的左下角座標和右上角座標分別為:(x1,y1)、(x2,y2),對這樣的乙個矩形,我們構造兩條線段,一條定位在x1,它在y座標的區間是[y1,y2],並且給定乙個cover域值為1;另一條線段定位在x2,區間一樣是[y1,y2],給定它乙個cover值為-1。根據這樣的方法對每個矩形都構造兩個線段,最後將所有的線段根據所定位的x從左到右進行排序。

上圖中,紅色的字型表示的是該線段的cover值。剛剛開始的時候,線段樹上的cover值都為0,但第一根線段(x==0)插入線段樹的之後,我們將線段樹上的cover加上該線段的cover,那麼,此時線段樹上被該線段覆蓋的位置上的cover的值就為1,下次再插入第二根線段(x==1)此時發現該線段所覆蓋的區間內,有一部分線段樹的cover為0,另有一部分為1,仔細觀察,但插入第二個線段的時候,如果線段樹上cover已經為1的那些區間,和現在要插入的第二根線段之間,是不是構成了並面積?還不明白?看下圖,綠色部分即為插入第二根線段後得到的並面積

在插入第三條線段時,計算的是1,2,3,4塊的面積,在插入第四條線段時,計算5的面積

夠清楚了吧!也就是說,我們插入某跟線段的時候,只要看該線段所在區間上的cover是否大於等於1,如果是,那麼就可以將並面積值加上(目前線段的x定位 - 上一線段的x定位)*(該區間的大小)

下面的演算法只有當遍歷到葉子節點的時候才加上面積

1 #include 

2 #include

3using

namespace std;

4const

int maxn=110;56

struct line

7 14 }line[2*maxn];

1516

struct tree

17 tree[1000*maxn];

2324

int n;

25double x1, y1, x2, y2;

26int index=0;

27double y[2*maxn];

2829

void build(int i, int l, int r)

30 41

int mid=(l+r)>>1;

42 build(2*i, l, mid);

43 build(2*i+1, mid, r);

44 }

4546

double insert(int i, double x, double l, double r, int flag) //

flag表示為左邊還是右邊

47 60

else

61

66 }

67double ans1, ans2;

68 ans1 = insert(2*i, x, l, r, flag);

69 ans2 = insert(2*i+1, x, l, r, flag);

70return ans1+ans2;

71 }

7273

int main( )

74 97 sort(&y[1], &y[index]); //

把所有的縱座標按從小到大排序,把1寫成了0,wa一次

98 sort(&line[1], &line[index]);

99 build(1, 1, index-1);

100double ans=0;

101for (i=1;i102

105 printf("

test case #%d\ntotal explored area: %.2f\n\n

", ++count, ans);

106 }

107return

0;108 }

如果會求面積並的話,面積交就不是問題了。只需要將原先判斷線段樹中cover值為大於等於1改為大於等於2即可!

#include#include #include #include using namespace std;

struct line

;struct node

;double yc[20000];

line m[20000];

bool cmp(line a,line b)

node tr[10000000];

void build_tree(int c,int s,int e)

build_tree(c<<1,s,(s+e)>>1);

build_tree(c<<1 |1,(s+e)>>1,e);

return ;

}double update(int c,double x,double s,double e,int flag)

else

}return update(c<<1,x,s,e,flag)+update(c<<1 |1,x,s,e,flag);

}int main()

{ int n,lyc,i,k,t;

double x1,x2,y1,y2,ans;

k=0;

scanf("%d",&t);

while (t--)

{scanf("%d",&n);

lyc=0;

for (i=0; i

矩形面積交

時間限制 1.0s 記憶體限制 512.0mb 問題描述 平面上有兩個矩形,它們的邊平行於直角座標系的x軸或y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個...

矩形面積交

問題描述 平面上有兩個矩形,它們的邊平行於直角座標系的x軸或y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10 7的實數表示。輸出格式 輸出僅...

矩形面積交

問題描述 平面上有兩個矩形,它們的邊平行於直角座標系的x軸或y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10 7的實數表示。輸出格式 輸出僅...