//線段樹-掃瞄線基礎模板
//掃瞄線與普通的線段樹區別要認清,這裡線是連續的,其他的型別單點是離散的
#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 ...