P5490 模板 掃瞄線

2021-10-10 07:19:00 字數 1733 閱讀 3279

n 給定n

nn個矩形左下角和右上角的座標,求該矩形面積並

資料範圍:n≤1

05n\leq 10^5

n≤105sol

utio

nsolution

soluti

on將每個矩形看做兩條平行於y

yy軸的線段,掃瞄過去即可

需要注意的是給出來的是點,而我們維護的是線段

時間複雜度:o(n

log⁡n)

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