目錄
矩形周長並
矩形面積並
矩形面積交
#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軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個...