取出縱向邊按x座標排序,在y方向上建立線段樹。
每次查詢當前有效長度len,ans += len*(x[i]-x[i-1]); 其中len為t[rt].len;
查詢完畢後更新y方向上線段樹,入邊+1, 出邊-1。
1 #include2view codeusing
namespace
std;
3#define lson l, m, rt<<1
4#define rson m+1, r, rt<<1|1
5 typedef long
long
ll;6
struct
l10 l(double x, double y1, double y2, int
d): x(x), y1(y1), y2(y2), d(d){}
11};
12 l line[500
];13
bool
cmp(l a, l b)
16double y[500
];17
18struct
node;
22 node t[500
<<3
];23
void
init()
26void pushup(int rt, int l, int
r)32
void update(int l, int r, int d, int l, int r, int
rt)38
int m = (l+r)>>1;39
if(l <=m) update(l, r, d, lson);
40if(r >m) update(l, r, d, rson);
41pushup(rt, l, r);42}
4344
intmain()
54 sort(line, line+2*n, cmp);
55 sort(y, y+2*n);
5657
init();
58double ans = 0;59
for(int i = 0; i < 2*n; i++)
66 printf("
test case #%d\n
", ca++);
67 printf("
total explored area: %.2f\n\n
", ans);68}
69return0;
70 }
無pushdown()函式,每條線段只存一次。d表示被覆蓋的次數,len表示至少被覆蓋一次的合法長度。詳見pushup()函式。
ans += t[1].len*(x[i]-x[i-1]);
求面積交:方法同求面積並,外加len2表示至少被覆蓋兩次的合法長度,ans += t[1].len2*(x[i]-x[i-1]);
求周長並:方法同面積並,掃瞄兩次,分別沿x方向和y方向,每次加上 更新前後t[1].len的差值的絕對值。
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線段產生覆蓋的區間是第一次計算的面積,覆蓋的區間相當於矩形長,再利用線段樹中...
HDU 1542 矩形的面積並求解
1.題目鏈結。其實是乙個比較經典的問題,自己對著 手動的畫一下就明白了。主要是弄清楚線段樹維護的到底是個什麼東西,在掃瞄線向上掃瞄的過程中,線段樹維護了當前x軸上有貢獻的線段長度。具體的思路是首先離散化每個點,然後在這些點上打標記,記錄每個點的貢獻,算出當前線段的長度即可。include inclu...