HDU 1225 覆蓋的面積(線段樹 掃瞄線)

2021-06-29 03:38:44 字數 1521 閱讀 7484

思路:

做到這一題的時候才真正的理解了上一題矩形並面積的思路

col[rt]表示這個區間被覆蓋了幾次,sum[rt]表示這個區間有效的長度。

這邊需要引入第三個變數sum2[rt]表示這個區間內被覆蓋兩次以上的有效部分大小,sum[rt]就變成了覆蓋一次的長度。

這邊需要思考的便是uprt函式,即更新父節點的函式。

col[rt]假如不等於0,則表示的就是有乙個矩形剛好等於或者包含這段區間。

所以更新父節點的函式應該是

void uprt(int l,int r,int rt)

if (col[rt] == 2)

if (col[rt] == 0)

}

#define _crt_secure_no_warnings

#include#include#include#includeusing namespace std;

#define max 3005

#define ls rt<<1

#define rs ls|1

#define m (l+r)>>1

double sum[max << 2];

double sum2[max << 2];

int col[max << 2];

double posx[max ];

struct pos

pos(double _l, double _r, double _h, int _s)

bool operator<(pos b) const

}p[max];

void uprt(int l,int r,int rt)

if (col[rt] == 2)

if (col[rt] == 0) }

void updata(int l, int r, int c, int l, int r, int rt)

int mid = m;

if (l <= mid)

updata(l, r, c, l, mid, ls);

if (mid < r)

updata(l, r, c, mid + 1, r, rs);

uprt(l, r, rt);

}int main()

sort(posx, posx + cnt);

sort(p, p + cnt);

int cnt2 = unique(posx,posx + cnt) - posx;

memset(col, 0, sizeof(col));//之前是用build函式來重置,但一直wa

memset(sum, 0, sizeof(sum));

memset(sum2, 0, sizeof(sum2));

double ans = 0;

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

printf("%.2lf\n", ans);

} 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...