【題目描述】
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就能搞定 如果是環套樹的話怎麼辦捏 首先考慮不經過環的答案,直接在外向樹上點分就行了 然後考慮經過環的答案 假設當前外向樹上...