HDU1542矩形面積並

2022-05-06 14:57:13 字數 1569 閱讀 5721

取出縱向邊按x座標排序,在y方向上建立線段樹。

每次查詢當前有效長度len,ans += len*(x[i]-x[i-1]); 其中len為t[rt].len;

查詢完畢後更新y方向上線段樹,入邊+1, 出邊-1。

1 #include2

using

namespace

std;

3#define lson l, m, rt<<1

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

5 typedef long

long

ll;6

struct

l10 l(double x, double y1, double y2, int

d): x(x), y1(y1), y2(y2), d(d){}

11};

12 l line[500

];13

bool

cmp(l a, l b)

16double y[500

];17

18struct

node;

22 node t[500

<<3

];23

void

init()

26void pushup(int rt, int l, int

r)32

void update(int l, int r, int d, int l, int r, int

rt)38

int m = (l+r)>>1;39

if(l <=m) update(l, r, d, lson);

40if(r >m) update(l, r, d, rson);

41pushup(rt, l, r);42}

4344

intmain()

54 sort(line, line+2*n, cmp);

55 sort(y, y+2*n);

5657

init();

58double ans = 0;59

for(int i = 0; i < 2*n; i++)

66 printf("

test case #%d\n

", ca++);

67 printf("

total explored area: %.2f\n\n

", ans);68}

69return0;

70 }

view code

無pushdown()函式,每條線段只存一次。d表示被覆蓋的次數,len表示至少被覆蓋一次的合法長度。詳見pushup()函式。

ans += t[1].len*(x[i]-x[i-1]);

求面積交:方法同求面積並,外加len2表示至少被覆蓋兩次的合法長度,ans += t[1].len2*(x[i]-x[i-1]);

求周長並:方法同面積並,掃瞄兩次,分別沿x方向和y方向,每次加上  更新前後t[1].len的差值的絕對值。

HDU 1542 矩形面積並)

problem description 已知atlantis的地圖由許多矩形構成,求它們的面積並。input 題目有多組資料,每組資料的開頭有乙個整數n 1 n 100 表示地圖數,接下來n行,每行4個小數 x1 y1 x2 y2 0 x1資料以0結束 output 對於每組資料,你需要輸出一行 t...

hdu 1542 矩形面積並

如圖 用乙個水平線從下往上進行掃瞄,遇到a線段 cover 1 將其插入線段樹中,線段樹中的每個節點都有個cover值,初始都為0,因此第一條線段插入時不會覆蓋其它線段 顯然的 接著是b線段 cover 1 插入線段樹,與a線段產生覆蓋的區間是第一次計算的面積,覆蓋的區間相當於矩形長,再利用線段樹中...

HDU 1542 矩形的面積並求解

1.題目鏈結。其實是乙個比較經典的問題,自己對著 手動的畫一下就明白了。主要是弄清楚線段樹維護的到底是個什麼東西,在掃瞄線向上掃瞄的過程中,線段樹維護了當前x軸上有貢獻的線段長度。具體的思路是首先離散化每個點,然後在這些點上打標記,記錄每個點的貢獻,算出當前線段的長度即可。include inclu...