傳送門
有一棵無根樹,現在有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,這樣如果一...