面積並問題 HDU 1542 Atlantis

2022-05-16 03:48:19 字數 3716 閱讀 3006

hdu 1542 傳送門:

題目大意就是幾個矩形相交,然後求出總的覆蓋面積,覆蓋多次的按一次算。典型的面積並問題。

大體思路:

記錄所給的點,排序,去掉重複的點,對點編號,可以理解成存放點的陣列的下表即為編號。

對y軸建立線段樹,利用線段樹計算面積。

ac_code:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;89

double x[2200],y[2200

];10

11double st[2200][8000

];12

13struct

n114

a[1100

];17

18int del(double *t,int n)//

去掉重複點的函式

1928

else

if(t[i] != s[top-1

])2932}

33for(i = 0;i < top; i++)

3437

return

top;38}

3940

int check_site(double *t,int s,int e,double x)//

二分查詢當前點的對應編號

4151

52double change(double *st,int l,int r,int node,int ml,int mr,int site)//

對線段樹更新

5364

else

return0;

65}6667

int m = (l+r)/2;68

69if(mr <=m)

7075

if(m <=ml)

7681

82double area = change(st,l,m,node+node,ml,m,site)+change(st,m,r,node+node+1

,m,mr,site);

83 st[node] +=area;

84return

area;85}

8687

intmain()

88105

106 sort(x,x+j);

107int sx =del(x,j);

108 sort(y,y+j);

109int sy = del(y,j);//

排序去掉重複點

110111

for(i = 0;i <= sy; i++)//

初始化線段樹

112115

116for(area = 0,i = 0;i < n; i++)

117130

131if(site_y1 >site_y2)

132137

138for(j = site_y1;j < site_y2; j++)//

每一棵線段樹的第乙個節點即為該段區域內的面積

139142

}143

144 printf("

test case #%d\n

",icase++);

145 printf("

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

",area);

146}

147return0;

148 }

view code

換成這種矩陣模擬的辦法也能過 時間和記憶體都有所減少  瞬間感覺自己絲毫沒有窺探到線段樹的精髓……sad

矩陣模擬的ac_code:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;89

double x[2200],y[2200

];10

11double st[2200][8000

];12

13struct

n114

a[1100

];17

18int del(double *t,int n)//

去掉重複點的函式

1928

else

if(t[i] != s[top-1

])2932}

33for(i = 0;i < top; i++)

3437

return

top;38}

3940

int check_site(double *t,int s,int e,double x)//

二分查詢當前點的對應編號

4151

52/*

double change(double *st,int l,int r,int node,int ml,int mr,int site)//對線段樹更新

5364

else return 0;65}

6667

int m = (l+r)/2;

6869

if(mr <= m)

7075

if(m <= ml)

7681

82double area = change(st,l,m,node+node,ml,m,site)+change(st,m,r,node+node+1,m,mr,site);

83st[node] += area;

84return area;85}

*/86

87double change(int x1,int x2,int y1,int

y2)88

100}

101}

102return

area;

103}

104105

intmain()

106123

124 sort(x,x+j);

125int sx =del(x,j);

126 sort(y,y+j);

127int sy = del(y,j);//

排序去掉重複點

128129

for(i = 0;i <= sy; i++)//

初始化線段樹

130133

134for(area = 0,i = 0;i < n; i++)

135148

149if(site_y1 >site_y2)

150155

156 area +=change(site_x1,site_x2,site_y1,site_y2);

157158

/*for(j = site_y1;j < site_y2; j++)//每一棵線段樹的第乙個節點即為該段區域內的面積

159*/

162}

163164 printf("

test case #%d\n

",icase++);

165 printf("

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

",area);

166}

167return0;

168 }

view code

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線段產生覆蓋的區間是第一次計算的面積,覆蓋的區間相當於矩形長,再利用線段樹中...

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