題意:在乙個給定大小的平面上給出一些不相交的矩形,在這個平面放乙個長度為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...