bzoj3648 寢室管理 環套樹 點分治

2022-09-11 02:09:10 字數 2226 閱讀 2855

【題目描述】

t64有乙個好朋友,叫t128。t128是寄宿生,並且最近被老師叫過去當宿管了。宿管可不是一件很好做的工作,碰

巧t128有乙個工作上的問題想請t64幫忙解決。t128的寢室條件不是很好,所以沒有很多錢來裝修。禮間寢室僅由n

-1條雙向道路連線,而且任意兩間寢室之間都可以互達。最近,t128被要求對一條路徑上的所有寢室進行管理,這

條路徑不會重複經過某個點或某條邊。但他不記得是哪條路徑了。他只記得這條路徑上有不少於k個寢室。於是,

他想請t64幫忙數一下,有多少條這樣的路徑滿足條件。嗯…還有乙個問題。由於最近有一些熊孩子不准晚上講話

很不爽,他們決定修築一條「情報通道」,如果通道建成,寢室就變成了乙個n個點n條邊的無向圖。並且,經過「

情報通道」的路徑也是合法的。t128心想:通道建成之前,t64還有乙個高效的演算法幫我數路徑條數,但是通道建

成之後,他還有辦法嗎?對,t64手忙腳亂,根本數不清有多少條路徑。於是他找到了你。

第一行為三個正整數n,m,k(2 ≤ k ≤ n),代表有n間寢室,m條邊連線它們n-1 ≤ m ≤ n;

m= n-1意味著「情報遁道」未被修好;m=n意味著「情報通道」已被修好),以及題目描述中的k。

接下來m行,每行兩個正整數z,y,代表第x間寢室與第y間寢室之間有一條雙向邊。

僅包含乙個整數,代表經過至少k間寢室的路徑條數。

5 5 2

1 32 4

3 54 1

5 220

n≤100000      

k≤nm=n           

【題解】

如果只是一棵樹,就是乙個裸的點分治模板題。

考慮環的情況,先把環去掉變成幾棵獨立的樹,在每棵樹上跑點分治。

現在來考慮環上的情況。

先把環倍長,於是就變成了一條鏈上,每個點接了一棵樹,對於鏈上後一半的節點,統計每個節點與之前 環長度-1 個鏈上節點的貢獻。可以保證不重複不遺漏。

/* --------------

user vanisher

problem bzoj-3648

----------------*/

# include # define n 100010

# define t 300000

# define inf 1e9

# define ll long long

using namespace std;

int read()

while (ch>='0'&&ch<='9')

return tmp*fh;

}struct nodee[n*2];

int h[t+10],low[n],dfn[n],place,head[n],ti,st[n],top,c[n],len,size[n],tag[n],mn,root,q[n],num,n,k,m;

ll ans;

void build(int u, int v)

int lowbit(int x)

int query(int x)

return num;

}void modify(int x, int num)

}void tarjan(int x, int fa)

else low[x]=min(low[x],dfn[e[ed].data]);

} if (low[x]==dfn[x]) }}

void findroot(int x, int fa, int tot)

mx=max(tot-size[x],mx);

if (mn>mx) mn=mx, root=x;

}void getdist(int x, int fa, int dist)

}void getdistlen(int x, int fa, int dist)

void del(int x, int fa, int la, int now)

void solve(int x)

for (int i=1; i<=top; i++) modify(st[i],-1);

for (int ed=head[x]; ed!=0; ed=e[ed].next)

if (tag[e[ed].data]==false)

}int main()

if (n!=m)

else

printf("%lld\n",ans);

} return 0;

}

具體實現見**。

bzoj3648 寢室管理 樹分治

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

bzoj3648 環套樹 點分治 樹狀陣列

tree 1s 128m by hzw czy神犇種了一棵樹,他想知道地球的質量 給定一棵n個點的樹,求樹上經過點的個數 k的路徑數量ans 對於部分資料,樹上某兩點間會多出最多一條無向邊 輸入資料 n,m,k 接下來n行,每行u,v表示u與v間有無向邊連線 輸出資料 ans樣例資料 input 5...

BZOJ3648 寢室管理(點分治 bit)

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