hdu4052 線段樹,矩形並

2021-06-16 21:47:12 字數 1569 閱讀 2459

題意:在乙個給定大小的平面上給出一些不相交的矩形,在這個平面放乙個長度為m的線段且不與任何乙個矩形相交,有多少種方法。

不失一般性的,可以先求橫著放線段的情況。如果列舉放線段的起點的話,那麼每個矩形前方m-1長度與自己等寬的區域也是不能放置起點的,那麼除去所有不能放置起點的區域,其餘區域的面積就是橫著放線段的方案數。豎著放同理。

求面積,上模板,線段樹求矩形並的面積。

#include #include #include #include #include #define ls(x) (x << 1)

#define rs(x) ((x << 1) + 1)

using namespace std;

const int maxn = 100000 + 100;

int w, h, n, m, tot;

mapmm;

int num[maxn];

struct rec

mac[maxn];

struct line

}lines[maxn];

struct seg_tree

}void update(int pos)

void add(int pos, int le, int ri, int flag)

else

update(pos);

}}tree;

void prework()

}void solve()

tot = 0;

for(map::iterator it = mm.begin(); it != mm.end(); ++it)

sort(lines, lines + 2 * n);

tree.build(1, 1, tot);

if(m != 1) tree.add(1, mm[h - m + 2], mm[h + 1], 1);

int sl = 1;

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

ans += (long long)((w + 1) - sl) * tree.ans[1];

mm.clear(); mm[1] = 0; mm[w + 1] = 0; mm[w - m + 2] = 0;

for(int i = 0; i < n; ++i)

tot = 0;

for(map::iterator it = mm.begin(); it != mm.end(); ++it)

sort(lines, lines + 2 * n);

tree.build(1, 1, tot);

if(m != 1) tree.add(1, mm[w - m + 2], mm[w + 1], 1);

sl = 1;

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

ans += (long long)((h + 1) - sl) * tree.ans[1];

if(m == 1) ans /= 2;

cout << ans << "\n";

}int main()

return 0;

}

線段樹 矩形面積並

給出n個矩形的左下角和右上角的座標,求矩形面積的並。矩形面積並指的是被矩形覆蓋到的面積和,重疊部分僅算一次。多組輸入,每組首先乙個整數 n,代表矩形的數量 接下來每行四個整數 x1,x2,y1,y2,表示左上角座標 x1,y1 與右下角 x2,y2 每行乙個整數,表示矩形的面積並。input 10 ...

hdu 1255 掃瞄線 線段樹計算矩形面積並

題目 題意 給你n個矩形,要你計算這些矩形被覆蓋兩次以上部分的面積和。做法 剛學的掃瞄線,留個板子和參考鏈結,很多地方容易出細節問題。include define lson rt 1 define rson rt 1 1 using namespace std const int maxn 1005...

線段樹矩形面積並,面積交,周長並

include include include include using namespace std const int maxn 2000 10 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 struct rec rec maxn 2 str...