題目描述
求 n 個矩形的面積並。
輸出格式
一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。
エラー発生:線段樹開小了, 因為n變成了兩倍,線段樹就得開4*2=8倍
對每一根掃瞄線, 維護所截得的長度, 每次乘以兩根掃瞄線高度差就得到了面積並
截得長度用線段樹維護即可
注意線段樹需要離散化
#include#include#include#include#include#include#define ll long long
#define rep(i, x, y) for(ll i = (x);i <= (y);i++)
using namespace std;
ll rd()
while(c >= '0' && c <= '9')
return flag * out;
}const ll maxn = 100010;
ll num, x[maxn << 1];
ll tot;//去重後的橫座標數
struct scanline
}line[maxn << 1];
#define lid (id << 1)
#define rid (id << 1) | 1
struct seg_treetree[maxn << 4];
void pushup(ll id)
void build(ll id, ll l, ll r)
ll mid = (l + r) >> 1;
build(lid, l, mid), build(rid, mid + 1, r);
pushup(id);
}void update(ll id, ll l, ll r, ll val)
update(lid, l, r, val);
update(rid, l, r, val);
pushup(id);
}void init();
line[i << 1] = (scanline);
} num = num << 1;
sort(x + 1, x + 1 + num);
sort(line + 1, line + 1 + num);
tot = unique(x + 1, x + 1 + num) - x - 1;
build(1, 1, tot - 1); }
void work()
cout<}int main()
P5490 模板 掃瞄線
n 給定n nn個矩形左下角和右上角的座標,求該矩形面積並 資料範圍 n 1 05n leq 10 5 n 105sol utio nsolution soluti on將每個矩形看做兩條平行於y yy軸的線段,掃瞄過去即可 需要注意的是給出來的是點,而我們維護的是線段 時間複雜度 o n log ...
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 ...