HDU 1542 矩形面積並)

2021-06-11 09:00:02 字數 1969 閱讀 8913

problem description

已知atlantis的地圖由許多矩形構成,求它們的面積並。

input

題目有多組資料,每組資料的開頭有乙個整數n(1<=n<=100),表示地圖數,接下來n行,每行4個小數 x1;y1;x2;y2 (0<=x1資料以0結束

output

對於每組資料,你需要輸出一行 「test case #k」,k表示第k組資料(從1開始).第二行為「total explored area: a」,a為面積並(保留2位小數),

每組資料後,請輸出乙個回車。

sample input

2

10 10 20 20

15 15 25 25.50

sample output

test case #1

total explored area: 180.00

矩形面積併入門題,

首先把直線拆成上邊和下邊,按高度排序,

橫座標離散化,建立線段樹。

cnt表示某條線段被覆蓋的次數,sum表示一條線段被覆蓋的長度

我們在計算cnt時,沒修改1個cnt,就用pushup把sum更新,得到程式1:

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn (2000+10)

#define maxt (1000*2*10)

#define lson (x<<1)

#define rson ((x<<1)^1)

int tt,n,size;

double x[maxn];

struct segment

segment(double _x1,double _x2,double _h,int _type):x1(_x1),x2(_x2),h(_h),type(_type){}

friend bool operator<(const segment a,const segment b)

void pushdown(int x)

}void pushup(int x)

void update(int x)

/*改變sum的值 */

if (r&1)

}// update(ll);update(rr); //向上傳遞

}void print()

segment(double _x1,double _x2,double _h,int _type):x1(_x1),x2(_x2),h(_h),type(_type){}

friend bool operator<(const segment a,const segment b)

void pushup(int x)

void update(int x)

}void insert(int l,int r,int c)

/*改變sum的值 */

if (r&1)

}update(ll);update(rr);

}}t;int main()

sort(a+1,a+2*n+1);

sort(x+1,x+2*n+1);

size=unique(x+1,x+2*n+1)-(x+1);

for (int i=1;i<=size;i++) hpos[x[i]]=i;

t.fillchar(size);

double ans=0;a[0].h=a[1].h;

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

printf("test case #%d\ntotal explored area: %.2lf\n\n",tt,ans);

}return 0;

}

hdu 1542 矩形面積並

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

HDU1542矩形面積並

取出縱向邊按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...

HDU 1542 矩形的面積並求解

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