矩形周長並,矩形面積並,矩形面積交

2021-08-24 17:53:52 字數 2478 閱讀 9504

目錄

矩形周長並

矩形面積並

矩形面積交

#includeusing namespace std;

const int maxn = 50004*2;

struct nodesegtree[maxn<<2];

struct lineline[maxn];

bool cmp(line a,line b)

void cal_len(int i)

if(segtree[i].l+1==segtree[i].r)else

}void update(int i,line e)

if(e.x2<=segtree[i<<1].rf) update(i<<1,e);

else if(e.x1>=segtree[i<<1|1].lf) update(i<<1|1,e);

else

cal_len(i);

}int main()segtree[maxn<<2];

struct lineline[maxn<<1];

bool cmp(line a,line b)

void cal_len(int t)

if(segtree[t].l+1==segtree[t].r) segtree[t].len=0;

else segtree[t].len=segtree[t<<1].len+segtree[t<<1|1].len;

}void update(int t,line e)

if(e.x2<=segtree[t<<1].rf) update(t<<1,e);

else if(e.x1>=segtree[t<<1|1].lf) update(t<<1|1,e);

else

cal_len(t);

}int main()

sort(line+1,line+t,cmp);

sort(x+1,x+t);

int len=unique(x+1,x+t)-x;

build(1,1,len-1);

update(1,line[1]);

double res=0;

for(int i=2;i(求兩個及以上的相交面積)

參考部落格

我們是怎麼計算最後的面積的?一樣的道理,從下往上掃瞄矩形,每次新增一條矩形上下邊,然後看看t[1].ss是多少,再乘上高度差。因為t[1]表示了總區間,而ss表示被覆蓋兩次或以上的長度,即計算時我們忽略掉只被覆蓋一次的長度

問題的關鍵變為怎麼計算乙個節點的ss

分情況討論

1.cnt>1 : 說明該區間被覆蓋兩次或以上,那麼長度就可以直接計算,就是該區間的長度

剩下的情況就是cnt=1或cnt=0

2.先看葉子節點,因為是葉子沒有孩子了,所以被覆蓋兩次貨以上的長度就是0(無論cnt=1或cnt=0都是0,因為是葉子。。。)

3.不是葉子節點 ,且cnt=1.注意這裡,cnt=1確切的意義是什麼,應該是,可以確定,這個區間被完全覆蓋了1次,而有沒有被完全覆蓋兩次或以上則不知道無法確定,那麼怎麼怎麼辦了,只要加上t[lch].s + t[rch].s  即,看看左右孩子區間被覆蓋了一次或以上的長度,那麼疊加在雙親上就是雙親被覆蓋兩次或以上的長度

3.不是葉子節點,且cnt=0,確切的意義應該是不完全不知道被覆蓋的情況(不知道有沒有被覆蓋,被覆蓋了幾次,長度是多少都不知道),這種情況,只能由其左右孩子的資訊所得

t[lch].ss + t[rch].ss  , 即直接將左右孩子給覆蓋了兩次或以上的長度加起來,這樣才能做到不重不漏

#includeusing namespace std;

const int maxn=2020;

struct nodesegtree[maxn*4];

struct lineline[maxn];

double x[maxn];

bool cmp(line a,line b)

void calen(int i)

else if(segtree[i].cover==1)

else

else

}}void update(int i,line e)

if(e.x2<=segtree[i<<1].rf) update(i<<1,e);

else if(e.x1>=segtree[(i<<1)|1].lf) update((i<<1)|1,e);

else

calen(i);

}int main()

sort(line+1,line+t,cmp);

sort(x+1,x+t);

int len=unique(x+1,x+t)-x;

build(1,1,len-1);

update(1,line[1]);

double ans=0;

for(int i=2;iprintf("%.2lf\n",ans);

}return 0;

}

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

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...

矩形面積並

hdu1542 include include include include using namespace std const int size 505 int add size 2 add為區間標記,與懶惰標記類似 double x size 2 sum size 2 struct node ...

矩形面積交

時間限制 1.0s 記憶體限制 512.0mb 問題描述 平面上有兩個矩形,它們的邊平行於直角座標系的x軸或y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個...