線段樹矩形面積並,面積交,周長並

2021-09-01 12:47:55 字數 4062 閱讀 5116

#include

#include

#include

#include

using

namespace std;

const

int maxn =

2000+10

;#define lson l, mid, rt<<1

#define rson mid+1, r, rt<<1|1

struct rec

}rec[maxn<<2]

;struct segtreetree[maxn<<2]

;double cor[maxn<<2]

;// l == r代表沒有子節點了

void

pushup

(int l,

int r,

int rt)

// 如果只被覆蓋一次, 那麼等於子線段覆蓋之和相加,就成了兩次

else

if(tree[rt]

.cnt ==1)

//一次都沒有覆蓋, 那就只能找子線段覆蓋兩次的。

else}}

void

update

(int l,

int r,

int v,

int l,

int r,

int rt)

int mid =

(l+r)

>>1;

update

(l,r,v,lson)

;update

(l,r,v,rson)

;pushup

(l,r,rt);}

intmain()

; rec[i+n]

= rec

; cor[i]

= x1; cor[i+n]

= x2;

} n <<=1;

sort

(rec+

1,rec+

1+n)

;sort

(cor+

1,cor+

1+n)

;int m =

unique

(cor+

1,cor+

1+n)

-cor-1;

double ans =0;

for(

int i =

1; i < n;

++i)

// ans += 1e-8;

// ans += 0.005;

printf

("%.2lf\n"

, ans);}

return0;

}

#include

using

namespace std;

const

int maxn =

400+10;

const

double eps =

1e-8

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

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

//線段樹的每個結點儲存的都是乙個線段,每個葉子結點實際儲存的是該點到下乙個點之間的距離

//所以update的時候需要將r-1

//pushup的時候需要x[r+1]-x[l];

//lazy:代表當前結點的線段被覆蓋多少次

//sum:代表當前結點為根的子樹中被覆蓋的區間一共有多長

struct rec

rec(

double x1,

double x2,

double y,

int d):x1

(x1),x2

(x2),y

(y),

d(d)

bool

operator

<

(const rec& rhs)

const

}r[maxn]

;double x[maxn]

, sum[maxn*4]

;int lazy[maxn*4]

;int n;

void

pushup

(int l,

int r,

int rt)

else

if(l == r) sum[rt]=0

;else sum[rt]

= sum[rt<<1]

+sum[rt<<1|

1];}

void

update

(int l,

int r,

int v,

int l,

int r,

int rt)

int m = l + r >>1;

if(l <= m)

update

(l, r, v, lson);if

(r > m)

update

(l, r, v, rson)

;pushup

(l, r, rt);}

intgetid

(double x,

int mm)

void

solve()

n <<=1;

sort

(r+1

,r+n+1)

;sort

(x+1

,x+n+1)

;int m =

int(

unique

(x+1

,x+n+1)

-x-1);

double ans =0;

for(

int i =

1; i < n;

++i)

printf

("%.2lf\n"

,ans);}

}int

main()

#include

#include

#include

using

namespace std;

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

const

int maxn =

20000+10

;struct rec

}rec[maxn<<2]

;struct segtree seg[maxn<<2]

;void

pushup

(int l,

int r,

int rt)

else

if(l == r)

else

}void

update

(int l,

int r,

int v,

int l,

int r,

int rt)

int mid =

(l+r)

>>1;

if(l <= mid)

update

(l,r,v,lson);if

(r > mid)

update

(l,r,v,rson)

;pushup

(l,r,rt);}

intmain()

; rec[i+n]

= rec

; lb =

min(x1,lb)

; rb =

max(x2,rb);}

n <<=1;

sort

(rec+

1,rec+

1+n)

;int ans =

0, pre =0;

for(

int i =

1; i <= n;

++i)

printf

("%d\n"

, ans);}

return0;

}

矩形周長並,矩形面積並,矩形面積交

目錄 矩形周長並 矩形面積並 矩形面積交 includeusing namespace std const int maxn 50004 2 struct nodesegtree maxn 2 struct lineline maxn bool cmp line a,line b void cal ...

線段樹 矩形面積並

給出n個矩形的左下角和右上角的座標,求矩形面積的並。矩形面積並指的是被矩形覆蓋到的面積和,重疊部分僅算一次。多組輸入,每組首先乙個整數 n,代表矩形的數量 接下來每行四個整數 x1,x2,y1,y2,表示左上角座標 x1,y1 與右下角 x2,y2 每行乙個整數,表示矩形的面積並。input 10 ...

線段樹 掃瞄法解決矩形的面積並 周長並問題

矩形的面積並問題 平面上有n個矩形,各邊均平行於座標軸,求它們覆蓋的總面積 重複覆蓋的只計一次 矩形的周長並問題 平面上有n個矩形,各邊均平行於座標軸,求它們覆蓋形成的多邊形的周長。演算法 面積並 先將所有矩形的上邊界和下邊界作為水平線段記錄下來,並對所有矩形的左右邊界對應的橫座標離散化,設離散化後...