題意:給出多個矩形,求這些矩形所覆蓋圖形的周長。
可用線段樹來做,兩種方法:
1、分別對x和y方向離散化後做線段樹,求出各方向上的輪廓長;
2、對乙個方向上的座標進行離散化,用另一維進行掃瞄;
1、覆蓋的線段長度;
2、不相邊的線段數;
3、該節點表示的區間兩端點是否被覆蓋(用於合併線段);
code
#include#include#include#define m 20008
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define mid(x,y) ((x+y)>>1)
typedef struct
}segt;
typedef struct line
line(int _x,int _y0,int _y1,char _f)
void set(int _x,int _y0,int _y1,char _f)
}line;
segt t[m<<2];
line ls[m];
int ys[m];
int yn;
int n;
int ans,len;
int abs(int a)
int cmpy(const void *a,const void *b)
int cmpl(const void *a,const void *b)
void create(int i,int lt,int rt)
else if(t[i].l+1==t[i].r)
else
}void updata(int i,line l)
mid=mid(t[i].l,t[i].r);
if(l.y1<=ys[mid])
updata(l(i),l);
else if(l.y0>=ys[mid])
updata(r(i),l);
else
cal(i);
}int main()
{ int i,j;
int xo,xl,yo,yl;
while(~scanf("%d",&n)){
for(i=0;i
POJ 1177 矩形周長並
參考部落格 方法 把矩形分成橫線和豎線去處理,可知是完全相同的操作,我們來講下怎麼算出橫線部分,豎線部分就是照搬即可。將橫線儲存在乙個表中,按橫線所處的豎直位置排序 公升序 另外每條橫線帶乙個標記值,原矩形的下線為1,上線為 1 對應過去就是插入線段和刪除線段 從低到高掃瞄橫線,沒掃到一條橫線就能計...
poj 1177 區間樹求矩形周長並
題意 在平面上給若干矩形,求它們的周長並。分析 用區間樹維護x軸上區間的一些覆蓋屬性。區間樹維護的是一些區間的性質,構造為build l,mid build mid,r 線段樹維護的是一些點的性質,構造為build l,mid build mid 1,r 區間樹經常被視為線段樹,但個人認為因為點線有...
POJ 1177 掃瞄線 輪廓線
題目大意 求多個矩形重合後的周長和 題目思路 從上到下來一遍掃瞄線,從左到右來一遍掃瞄線。然後每次更新線段樹後整體解與之前的結果相減取絕對值就是新的周長。可以畫圖理解。以下是 include include include include includeusing namespace std def...