突然意識到忘記掃瞄線怎麼寫叻,趕快補補。
我是離散化了y座標,將x座標排序,線段樹裡面下標是離散後的y,存的是實際的覆蓋了的y的長度。
主要是$update$的時候,如果當前整個區間都被覆蓋叻,那麼直接更新成這段的實際長度。如果已經到葉子節點,長度就是0,剩下是沒有被覆蓋完的情況,就用左右兒子更新。
查詢時只需要$o(1)$取出當前根節點即可,因為存的是當前全域性中被覆蓋了的y區間,乘上x區間(因為是座標軸所以左閉右開)即可。
然後離散化和$update$的時候都要左閉右開!!最好記一下套路吧...
#includeusingnamespace
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 ...