JZOJ 6276 樹 掃瞄線 線段樹

2021-09-25 23:15:23 字數 2824 閱讀 5090

傳送門

有一棵無根樹,現在有m

mm個點對x,y

x,yx,

y,要求在任意u,v

u,vu,

v的簡單路徑上不能既經過x

xx又經過y

yy問一共有多少路徑滿足要求

正著推看起來思維難度很高,所以我們喜聞樂見的反著推,找出不合法的方案數就好了

我們先求出無根樹的dfs

dfsdf

s序,在輸入每個點對後,我們結合兩個點的dfs

dfsdf

s序,用掃瞄線形成乙個矩形,在矩形內的所有點都是不合法的

再然後我們用線段樹來維護我們的掃瞄線

#pragma gcc optimize("ofast")

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define lzx mu

using namespace std;

inline ll read()

while

(s>=

'0'&&s<=

'9')

return d*f;

}int n,m,fir[

100005];

int cnt,tot,ls[

200005

],v[

100005

],sec[

100005];

int num=

0,f[

100005][

30],dep[

100005

],t;

ll ans;

struct treet[

800005];

struct line_nodeline[

400005];

struct edgea[

200005];

void

build

(int k,

int l,

int r)

void

change

(int k,

int l,

int r,

int num)

int mid=

(t[k]

.l+t[k]

.r)>>1;

if(r<=mid)

change

(k*2

,l,r,num)

;else

if(l>mid)

change

(k*2+1

,l,r,num)

;else

change

(k*2

,l,mid,num)

,change

(k*2+1

,mid+

1,r,num);if

(t[k]

.mark) t[k]

.w=t[k]

.r+1

-t[k]

.l;else t[k]

.w=t[k*2]

.w+t[k*2+

1].w;return;}

void

add1

(int x,

int y)

; ls[x]

=tot++

;return;}

void

add2

(int x1,

int x2,

int y1,

int y2)

; line[

++num]

=(line_node)

;return;}

void

dfs(

int x,

int fa)

sec[x]

=cnt;

return;}

intmarmot

(int x,

int y)

bool cmp

(line_node x,line_node y)

intmain()

dfs(1,

0); t=

(int)(

log(n)

/log(2

))+1

;for

(register

int j=

1;j<=t;j++

)for

(register

int i=

1;i<=n;i++

) f[i]

[j]=f[f[i]

[j-1]]

[j-1];

for(

register

int i=

1;i<=m;i++

)else

add2

(fir[x]

,sec[x]

,fir[y]

,sec[y]);

}sort

(line+

1,line+

1+num,cmp)

;build(1

,1,n);

int l=1;

for(

register

int i=

1;i<=n;i++

) ans+

=t[1

].w;

} cout<<

(ll)n*

(n-1)/

2-ans;

return0;

}

線段樹 掃瞄線

pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...

掃瞄線 線段樹

問題描述 小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。輸入 第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx,ly,rx,ry四個整數,表示被乙個工廠汙...

線段樹 掃瞄線

掃瞄線問題主要利用了線段樹。因為矩形的並集比較難算,所以我們可以用 sum 掃瞄線被截長度 所掃瞄的高度 來求和。而這樣做發現可以用線段樹來優化,具體優化方式如下 所掃瞄的高度比較好求,主要是掃瞄線被截長度需要優化。我們可以設橫邊有乙個a權值,如果該邊是矩陣的下邊則設為1,相反就設為 1,這樣如果一...