n 給定n
nn個矩形左下角和右上角的座標,求該矩形面積並
資料範圍:n≤1
05n\leq 10^5
n≤105sol
utio
nsolution
soluti
on將每個矩形看做兩條平行於y
yy軸的線段,掃瞄過去即可
需要注意的是給出來的是點,而我們維護的是線段
時間複雜度:o(n
logn)
o(n\log n)
o(nlogn)co
decode
code
#include
#include
#include
#include
#define ll long long
#define n 200010
using
namespace std;
int n,m,b[n]
;ll ans;
struct nodea[n]
;inline
bool
cmp(node x,node y)
struct xds
inline
void
modify
(int ql,
int qr,
int d,
int k=1,
int l=1,
int r=n)
int mid=l+r>>1;
if(ql<=mid)
modify
(ql,qr,d,lson,l,mid);if
(qr>mid)
modify
(ql,qr,d,rson,mid+
1,r)
;return
(void)(
pushup
(k,l,r));
}#undef lson
#undef rson
}t;inline ll read()
signed
main()
;a[2
*i]=
(node)
; b[
++m]
=y1;b[
++m]
=y2;
} n<<=1;
sort
(b+1
,b+1
+m);
m=unique
(b+1
,b+1
+m)-b-1;
sort
(a+1
,a+1
+n,cmp)
;for
(register
int i=
1;i)printf
("%lld"
,ans)
;}
P5490 模板 掃瞄線 掃瞄線
題目描述 求 n 個矩形的面積並。輸出格式 一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。発生 線段樹開小了,因為n變成了兩倍,線段樹就得開4 2 8倍 對每一根掃瞄線,維護所截得的長度,每次乘以兩根掃瞄線高度差就得到了面積並 截得長度用線段樹維護即可 注意線段樹需要離散化 include i...
P5490 模板 掃瞄線
掃瞄線的過程不做多述 主要講解 實現,沒有深刻理解是無法完全打出來的 首先離散化x座標,因為我們要用線段樹進行維護,x座標過大,陣列範圍是不允許的 再考慮線段樹怎麼維護 假如維護k 1,3 兩個子節點k1 1,2 k2 3,3 假如k1的len x 2 x 1 那k2的len x 3 x 3 k2此...
線段樹 掃瞄線 P5490 模板 掃瞄線
首先有這麼一張圖,要求它的面積並。我們想,如果可以有一條掃瞄線從下往上掃,記錄它所掃到的邊的長度 並 len 再求出這條邊與即將掃到的下一條邊的距離 h 那麼我們就可以求出第一塊面積 紫色 s 1 len times h 然而如何求出這個 len 顯然只用當前邊的長度是不行的,如 當掃到邊 r 2 ...