題目大意:中文題
解題思路:記錄區間被cover的次數,區間的被cover1次的長度len,區間被cover2次或者2次以上的長度twice
所要求的覆蓋面積,就是求被cover兩次或者兩次以上的長度 * 高的和
首先判斷是否被cover過,先更新一下len
1.接著判斷一下是否被cover過次或者兩次以上,如果符合,直接等於右端點-左端點
2.如果不符合條件1,且l == r ,那麼twice = 0
3.如果不符合2,但是滿足cover == 1,那麼twice[u] = len[u << 1] + len[u << 1 | 1], 因為左右區間被覆蓋一次的長度會被再覆蓋一次
4.如果不符合條件3,twice[u] = twice[u << 1] + twice[u << 1 | 1]
#include
#include
#include
#include
using
namespace
std;
const
int n = 2010;
const
int m = 2010
<< 2;
struct segments[n];
int cnt, n, m;
int cover[m];
double pos[n], len[m], twice[m];
void build(int u, int l, int r)
int cmp(const segment a, const segment b)
void init()
sort(s + 1, s + cnt, cmp);
sort(pos + 1, pos + cnt);
m = 1;
for (int i = 2; i < cnt; i++)
if (pos[i] != pos[i - 1]) pos[++m] = pos[i];
build(1, 1, m);
}void getlen(int u, int l, int r)
void modify(int u, int l, int r, int l, int r, int c)
int mid = (l + r) >> 1;
if (r <= mid) modify(u << 1, l, mid, l, r, c);
else
if (l > mid) modify(u << 1 | 1, mid + 1, r, l, r, c);
else
getlen(u, l, r);
}int find(double val)
return -1;
}void solve()
printf("%.2lf\n", ans);
}int main()
return
0;}
hdu 1255 覆蓋的面積 線段樹
記錄3個變數。sum i 當前區間被覆蓋2次及兩次以上的面積。num i 當前區間被覆蓋1次及一次以上的面積。cover i 覆蓋的lazy標記。對於每乙個區間.更新操作如下 void push up int now if cover rt 1 if cover rt 2 那麼剩下的問題就是簡單的區...
hdu 1255 覆蓋的面積(線段樹求面積交)
給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...
HDU 1255 覆蓋的面積(線段樹求矩形面積交)
題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...