HDU 1255 覆蓋的面積 線段樹 掃瞄線

2021-07-06 01:24:53 字數 1482 閱讀 1578

題目大意:中文題

解題思路:記錄區間被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...