bzoj3648 環套樹 點分治 樹狀陣列

2021-09-12 10:03:36 字數 2430 閱讀 2708

tree 1s 128m  by hzw

czy神犇種了一棵樹,他想知道地球的質量

給定一棵n個點的樹,求樹上經過點的個數≥k的路徑數量ans

對於部分資料,樹上某兩點間會多出最多一條無向邊

輸入資料

n,m,k

接下來n行,每行u,v表示u與v間有無向邊連線

輸出資料

ans樣例資料

input

5 5 2

1 32 4

3 54 1

5 2output

20資料範圍

30%的資料n,m<=5000

100%的資料n,m<=100000

其中有50%的資料滿足m+1=n,具體如下

測試點前3個小資料1樹2鏈 3環+外向樹 

後7個大資料4-6樹 7-8環 9-10環+外向樹 

如果沒有環,那就是經典點分治題目啦。

題目保證有且只有乙個環,那麼我們先隨便拆掉環上的一條邊,然後用點分治算出不經過這條邊的滿足題意的路徑數量。

ans需要加上經過這條邊的滿足題意的路徑數量。

這個怎麼求呢?

看我醜醜的圖。。

環可以用並查集判斷(注意每次更新fa[x]不然容易暴棧),要刪的邊就直接不要插入。

樹狀陣列用來判斷》=x的有多少個,注意0會死迴圈,加個偏移量,負數就直接公升到1。

**:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

78 typedef long

long

ll;9

const

int n=100010;10

intn,m,k,cx,cy,cl,tl,sl,len,has_circle;

11int

first[n],c[n],s[n],t[n],d[n],mark[n],size[n],f[n],cir[n];

12struct

nodea[2*n];

15ll ans;

1617

bool cmp(int x,int y)

1819

void ins(int x,int

y)20

2425

int findfa(int

x)26

3031

void add(int x,int

val)

3236

int getsum(int

x)37

4445

void find_root(int x,int fa,int tot,int &root)

4657

if(bk && 2*(tot-size[x])<=tot) root=x;58}

5960

void dfs(int x,int fa,int

tmp)

6167 t[++tl]=d[x];

68 size[x]=1;69

for(int i=first[x];i;i=a[i].next)

7076}77

78void dfs(int x,int

tot)

7994}95

for(int i=1;i<=sl;i++) add(s[i],-1

);96

for(int i=first[x];i;i=a[i].next)

97102

}103

104void find_circle(int x,int

fa)105

107for(int i=first[x];i;i=a[i].next)

108113

}114

}115

116void

solve_circle()

117141

}142

143int

main()

144165

else

166170

}171

//for(int i=1;i<=len;i+=2) printf("%d --> %d\n",a[i].x,a[i].y);

172 dfs(1

,n);

173if

(has_circle) solve_circle();

174 printf("

%lld\n

",ans);

175return0;

176 }

posted @

2016-11-10 15:12

攔路雨偏似雪花 閱讀(

...)

編輯收藏

bzoj3648 寢室管理 環套樹 點分治

題目描述 t64有乙個好朋友,叫t128。t128是寄宿生,並且最近被老師叫過去當宿管了。宿管可不是一件很好做的工作,碰 巧t128有乙個工作上的問題想請t64幫忙解決。t128的寢室條件不是很好,所以沒有很多錢來裝修。禮間寢室僅由n 1條雙向道路連線,而且任意兩間寢室之間都可以互達。最近,t128...

bzoj3648 寢室管理 樹分治

題目大意 給一顆基環樹,求所有長度大於等於k的路徑。題目分析 如果沒有環,只有樹的話,只要裸上樹分治就可以了。有環的話我們就先把環上的一條邊去掉,然後做樹分治。這樣我們就統計出了所有不經過這條邊的路徑樹,還剩下所有經過這條邊的路徑數。我們此時處理出以環上所有點位根的子樹資訊,並將其合併。然後每次去掉...

BZOJ3648 寢室管理(點分治 bit)

傳送門 sunshine學長去年的互測題orz 然而他給的solution除了點分和bit什麼都沒說啊。硬著頭皮想吧,反正我知道要用bit了。如果是樹的話點分治 二分或者bit就能搞定 如果是環套樹的話怎麼辦捏 首先考慮不經過環的答案,直接在外向樹上點分就行了 然後考慮經過環的答案 假設當前外向樹上...