覆蓋的面積(HDU 1255)

2021-10-25 10:28:03 字數 1730 閱讀 3815

在平面上給出若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.

這題相當於掃瞄線的高階版本。基本的掃瞄線就不講了,講一下這題的拓展處。記錄一下每一段被完全覆蓋的次數,維護區間被覆蓋的面積(覆蓋一次以上)維護區間被覆蓋兩次以上的部分的面積,顯然,對於已經覆蓋》=2的情況,整個區域都是合法的情況,更新的時候整段都當做合法的維護進去就好。對於當前整個區間已經被覆蓋了一次的情況,那麼向下詢問子區間內已經覆蓋一次以上的區間,那麼合起來就是重複兩次以上了。

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2022

;#define sfi(a) scanf("%d",&a)

#define sfl(a) scanf("%lld",&a)

#define sff(a) scanf("%lf",&a)

struct line

}line[maxn<<1]

;struct segmentree

tre[maxn<<3]

;ll ix[maxn<<1]

;int n,m;

double ry[maxn<<1]

;void

pushup

(int p)

elseif(

cov(p)==1

)}else

}void

build

(int p,

int l,

int r)

int mid=(l

(p)+

r(p))/

2;build

(p<<

1,l,mid)

;build

(p<<1|

1,mid+

1,r);}

void

addtre

(int p,

int l,

int r,

int val)

int mid=(l

(p)+

r(p))/

2;if(mid>=l)

addtre

(p<<

1,l,r,val);if

(midaddtre

(p<<1|

1,l,r,val)

;pushup

(p);

}void

solve()

sort

(line+

1,line+1+

2*n)

;sort

(ry+

1,ry+1+

2*n)

;build(1

,1,2

*n);

for(

int i=

1;i<=

2*n;

++i)

double ans=

0.00

;for

(int i=

1;i<=

2*n;

++i)

printf

("%.2lf\n"

,ans+

1e-6);

}int

main()

hdu 1255 覆蓋的面積

與poj1151略有不同 由於是大於等於2 的有效 所以應該更新到點 include include include include include include include include include includeusing namespace std define inf 0x3f3...

HDU 1255 覆蓋的面積

題目鏈結點這裡 這道題,很久以前做過,當時寫了個暴力,居然過了,然後一直想寫下線段樹的,結果一直被各種事搞得忘了。現在終於填坑了。include include include includeusing namespace std define mem x,y memset x,y,sizeof x...

HDU 1255 覆蓋的面積

題目 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input 輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...