給定乙個矩形的左下角座標和右上角座標分別為:(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如果會求面積並的話,面積交就不是問題了。只需要將原先判斷線段樹中cover值為大於等於1改為大於等於2即可!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 }
#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的實數表示。輸出格式 輸出僅...