P5490 模板 掃瞄線 掃瞄線

2022-06-05 10:12:10 字數 1284 閱讀 6000

題目描述

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