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