hdu 1542 傳送門:
題目大意就是幾個矩形相交,然後求出總的覆蓋面積,覆蓋多次的按一次算。典型的面積並問題。
大體思路:
記錄所給的點,排序,去掉重複的點,對點編號,可以理解成存放點的陣列的下表即為編號。
對y軸建立線段樹,利用線段樹計算面積。
ac_code:
1 #include 2 #include 3 #include 4 #include 5 #include 6view code7using
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 }
換成這種矩陣模擬的辦法也能過 時間和記憶體都有所減少 瞬間感覺自己絲毫沒有窺探到線段樹的精髓……sad
矩陣模擬的ac_code:
1 #include 2 #include 3 #include 4 #include 5 #include 6view code7using
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 }
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...