掃瞄線模板

2022-05-16 01:24:18 字數 1237 閱讀 4296

突然意識到忘記掃瞄線怎麼寫叻,趕快補補。

我是離散化了y座標,將x座標排序,線段樹裡面下標是離散後的y,存的是實際的覆蓋了的y的長度。

主要是$update$的時候,如果當前整個區間都被覆蓋叻,那麼直接更新成這段的實際長度。如果已經到葉子節點,長度就是0,剩下是沒有被覆蓋完的情況,就用左右兒子更新。

查詢時只需要$o(1)$取出當前根節點即可,因為存的是當前全域性中被覆蓋了的y區間,乘上x區間(因為是座標軸所以左閉右開)即可。

然後離散化和$update$的時候都要左閉右開!!最好記一下套路吧...

#includeusing

namespace

std;

intn;

int x1[105], y1[105], x2[105], y2[105

];struct

tr } line[

505];

bool cmp(tr a, tr b)

long

long tag[505

];long

long tree[505], a[1005

];void push_down(int nd, int l, int

r) void add(int nd, int l, int r, int l, int r, int

opt)

push_down(nd, l, r);

int mid = (l + r) >> 1

;

if(l <= mid) add(nd << 1

, l, mid, l, r, opt);

if(r > mid) add(nd << 1 | 1, mid + 1

, r, l, r, opt);

push_down(nd, l, r);

}int

main()

sort(a + 1, a + 1 +tot);

sort(line + 1, line + 1 +tot, cmp);

int m = unique(a + 1, a + 1 + tot) - a - 1

;

long

long ans = 0

;

for(int i = 1; i < tot; i ++)

printf(

"%lld

", ans);

return0;

}

模板 掃瞄線

矩形有重疊,求總面積。橫縱兩條掃瞄線 includeusing namespace std double x 2002 y 2002 最多100個矩形,所以最多只有200條橫線或縱線 double a 1002 4 矩形實際座標,分別是左下角橫 縱,右下角橫 縱 bool cover 2002 20...

P5490 模板 掃瞄線 掃瞄線

題目描述 求 n 個矩形的面積並。輸出格式 一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。発生 線段樹開小了,因為n變成了兩倍,線段樹就得開4 2 8倍 對每一根掃瞄線,維護所截得的長度,每次乘以兩根掃瞄線高度差就得到了面積並 截得長度用線段樹維護即可 注意線段樹需要離散化 include i...

線段樹 掃瞄線 P5490 模板 掃瞄線

首先有這麼一張圖,要求它的面積並。我們想,如果可以有一條掃瞄線從下往上掃,記錄它所掃到的邊的長度 並 len 再求出這條邊與即將掃到的下一條邊的距離 h 那麼我們就可以求出第一塊面積 紫色 s 1 len times h 然而如何求出這個 len 顯然只用當前邊的長度是不行的,如 當掃到邊 r 2 ...