線段樹 掃瞄線區間模板

2021-10-05 17:14:00 字數 1602 閱讀 3560

//線段樹-掃瞄線基礎模板

//掃瞄線與普通的線段樹區別要認清,這裡線是連續的,其他的型別單點是離散的

#include

#include

#include

using

namespace std;

int n;

const

int maxn=

10000

;struct node

void

get(

int a,

int b,

int c,

int f)

}line[maxn<<2]

;//線段樹維護兩個陣列,即邊的長度陣列和是否有邊的陣列

int sum[maxn<<2]

;//要開4倍左右

//這裡要注意了,sum[i]維護的是區間之間的距離,一定要注意他維護的是區間!而不是點,所以區間長度總比點少一

int state[maxn]

;//離散化後的區間點

int cnt[maxn*4]

;//線段樹所維護的掃瞄線區間,用於判斷該離散段是否有邊

bool

cmp(node x,node y)

intserach

(int t,

int n)

return-1

;}void

pushup

(int rt,

int left,

int right)

//這裡是掃瞄線的核心

void

updata

(int l,

int r,

int l,

int r,

int rt,

int num)

int mid=

(l+r)

>>1;

if(l<=mid)

updata

(l,r,l,mid,rt<<

1,num);if

(midupdata

(l,r,mid+

1,r,rt<<1|

1,num)

;pushup

(rt,l,r)

;return;}

intmain()

//重要!將x座標離散化,因為線段樹無法維護浮點數區間

sort

(state,state+k)

;sort

(line,line+k,cmp)

;for

(int i =

0; i)int m =1;

for(

int i=

1;i)//查重

}memset

(cnt,0,

sizeof

(cnt));

memset

(sum,0,

sizeof

(sum));

int ans=0;

for(

int i=

0;i1;i++

)printf

("%d\n"

,ans)

;return0;

}

線段樹掃瞄線模板

hdu 1542 hdu 1255 hdu 3642平面面積並 題目鏈結 超級棒的題解 include using namespace std const int n 210 int cnt n 2 double sum n 2 x n struct seg seg double a,double ...

線段樹區間合併 掃瞄線

線段樹區間合併 掃瞄線 題目 求n個矩形面積並 includeusing namespace std typedef long long ll const int n 1e6 5 int t n 2 標記數量 int vis n 2 標記陣列 void update int root,int kl,...

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

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