線段樹掃瞄線(2 算矩形的相交面積)

2022-05-20 14:00:38 字數 2200 閱讀 5665

hdu-1255

首先感謝一下 titanium: 從他的部落格中得到了思路

怎麼計算出重複的面積。

我們先規定sum2 為 至少出現1次時統計的長度 sum為至少出現2次時的長度

如果某個區間的cnt >= 2 那麼 就表示這個這個區間的所有長度都是有效長度, sum就等於這個區間的總長度

當cnt == 1時, 表示這整個區間線段至少出現過一次  並且這個區間內的部分線段可能會出現好多次 

這個時候訪問這個節點的左子樹和右子樹的sum2,sum = sum2(左子樹)+sum2(右子樹)。

因為這個區間的cnt == 1 表示目前這個區間的長度都至少出現過了一次, 由於是區間更新且沒有下推cnt標記

如果左子樹或右子樹上sum2 != 0, 那麼表示在左子樹或右子樹上又出現了一次。

那麼子樹上的一次+目前區間的一次 就能保證出現兩次(及以上)。

(請讀者充分理解線段樹的區域更新, 如果cnt 上有值的話,那麼表示 這個區間被完全覆蓋的。 

如果區間a被完全覆蓋了, 那麼會在區間a對應的cnt++, 然後 進行更新和返回(return;)

但是由於不下推, 所以a的左子樹或者右子樹上的cnt都不會發生變化。所以,如果a的左子樹或右子樹上

的cnt不為0,那麼一定有另一條線掃瞄到了左子樹或者右子數,並且沒有完全覆蓋區間a。

所以,如果a的cnt == 1並且 a的子樹上有值,那麼子樹上的線段長度和就是至少訪問過2次的線段長度和了);

當然 如果 l==r的時候有效長度還是為0的, 因為葉子節點沒有長度。

1 #include2 #include3 #include4

#define lson l,m,rt<<1

5#define rson m+1,r,rt<<1|1

6using

namespace

std;

7const

int n =1e4;

8struct

node916

}a[n];

17double

x[n], sum[n], sum2[n];

18int

cnt[n];

19void build(int l, int r, int

rt)20

27void pushup(int l, int r, int

rt)28

33else

if(l == r) sum2[rt] = 0.0;34

else sum2[rt] = sum2[rt<<1] + sum2[rt<<1|1

];35 if(cnt[rt] > 1)

36 sum[rt] = x[r] - x[l-1];

37 else if(l == r) sum[rt] = 0;

38 else if(cnt[rt] == 1) sum[rt] = sum2[rt<<1]+sum2[rt<<1|1];

39 else sum[rt] = sum[rt<<1] + sum[rt<<1|1];40}

41void revise(int l, int r, int c, int l, int r, int

rt)42

49int m = l+r >> 1;50

if(l <=m) revise(l,r,c,lson);

51if(m 52pushup(l,r,rt);53}

54void add(double l, double r, double h, int d, int

i)55

59int

main()

6078 sort(x,x+k);

79 sort(a,a+k);

80int pos = 1;81

for(int i = 1; i < k; i++)

8286 build(1,pos,1

);87

double ans = 0;88

for(int i = 0; i < k-1; i++)

8995 cout << fixed

<< setprecision(2) << ans+0.0001

<96}                                  //所以補了一點上去就給過了

97return0;

98 }

線段樹求矩形面積並 掃瞄線 離散化

顧名思義,掃瞄法就是用一根想象中的線掃過所有矩形,在寫 的過程中,這根線很重要。方向的話,可以左右掃,也可以上下掃。方法是一樣的,這裡我用的是由下向上的掃瞄法。如上圖所示,座標系內有兩個矩形。位置分別由左下角和右上角頂點的座標來給出。上下掃瞄法是對x軸建立線段樹,矩形與y平行的兩條邊是沒有用的,在這...

線段樹求矩形面積並 掃瞄線 離散化

顧名思義,掃瞄法就是用一根想象中的線掃過所有矩形,在寫 的過程中,這根線很重要。方向的話,可以左右掃,也可以上下掃。方法是一樣的,這裡我用的是由下向上的掃瞄法。如上圖所示,座標系內有兩個矩形。位置分別由左下角和右上角頂點的座標來給出。上下掃瞄法是對x軸建立線段樹,矩形與y平行的兩條邊是沒有用的,在這...

線段樹輔助 掃瞄線法計算矩形面積並

分析 2.重點 掃瞄線法 假想有一條掃瞄線,從左往右 從右往左 或者從下往上 從上往下 掃瞄過整個多邊形 或者說畸形。多個矩形疊加後的那個圖形 如果是豎直方向上掃瞄,則是離散化橫座標,如果是水平方向上掃瞄,則是離散化縱座標。下面的分析都是離散化橫座標的,並且從下往上掃瞄的。掃瞄之前還需要做乙個工作,...