日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

树上摩托【NOIP2016提高A组模拟9.4】

發(fā)布時(shí)間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树上摩托【NOIP2016提高A组模拟9.4】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

Sherco是一位經(jīng)驗(yàn)豐富的魔♂法師。
Sherco在第零次圣杯戰(zhàn)爭(zhēng)中取得了勝利,并取得了王之寶藏——王の樹(shù)。
他想把這棵樹(shù)砍去任意條邊,拆成若干棵新樹(shù),并裝飾在他的摩托上,讓他的摩托更加酷炫。
但Sherco認(rèn)為,這樣生成的樹(shù)不具有美感,于是Sherco想讓每棵新樹(shù)的節(jié)點(diǎn)數(shù)相同。
他想知道有多少種方法分割這棵樹(shù)。
樣例輸入:
第一行一個(gè)正整數(shù)N,表示這棵樹(shù)的結(jié)點(diǎn)總數(shù)。
接下來(lái)N-1行,每行兩個(gè)數(shù)字X,Y表示編號(hào)為X的結(jié)點(diǎn)與編號(hào)為Y的結(jié)點(diǎn)相連。結(jié)點(diǎn)編號(hào)的范圍為[1,N]。
6
1 2
2 3
2 4
4 5
5 6

樣例輸出:
一個(gè)整數(shù),表示方案數(shù)。注意,不砍去任何一條邊也算作一種方案。
3

數(shù)據(jù)范圍:
對(duì)于40%的數(shù)據(jù),N ≤ 15
對(duì)于60%的數(shù)據(jù),N ≤ 10^5
對(duì)于100%的數(shù)據(jù),N ≤ 10^6
數(shù)據(jù)規(guī)模非常大,請(qǐng)使用高效的讀入方式。


剖解題目

。。。。。


思路

只知道和n的約數(shù)有關(guān)。。。。。


解法

40%:暴力枚舉刪哪些邊。
60%:搞一搞可以知道一些性質(zhì)。
1.樹(shù)的大小只可能是n的約數(shù)。
2.樹(shù)的大小確定后,如果有分割方案只可能有一種。
所以直接枚舉樹(shù)的大小,dfs判斷即可。時(shí)間O(nn)
100%:繼續(xù)找性質(zhì)。
發(fā)現(xiàn),如果一個(gè)節(jié)點(diǎn)可以作為一塊的根,那么以這個(gè)節(jié)點(diǎn)為根的子樹(shù)的size一定能被塊的大小整除。
預(yù)處理出所有節(jié)點(diǎn)size,枚舉樹(shù)的大小k,如果size為k的倍數(shù)的節(jié)點(diǎn)數(shù)的大小是n/k的話,便是合法方案,加入答案。時(shí)間O(nlogn)。
然而,如果用dfs弄會(huì)爆棧,所以用bfs吧(好難搞QwQ)


代碼

#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn=1000005; int n,num,ans; int fre[maxn*2],next[maxn*2],go[maxn*2],size[maxn],T[maxn*2],dad[maxn]; bool bz[maxn],b[maxn];void add(int x,int y) {go[++num]=y;next[num]=fre[x];fre[x]=num; } int main() { // freopen("T.in","r",stdin);scanf("%d",&n);fo(i,1,n-1){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}int h=0,t=1,hh=0,tt=0;T[1]=1;bool bo;while (h!=t){int u=T[++h];b[u]=true;int i=fre[u];while (i){if (b[go[i]]) {i=next[i];continue;}T[++t]=go[i];dad[go[i]]=u;i=next[i];}}h=1; t++;while (t!=h){int u=T[--t];size[u]++;int i=fre[u];while (i){if (go[i]==dad[u]) size[go[i]]+=size[u];i=next[i];}}ans=1;fo(i,2,n/2)if (n%i==0){int t=0;fo(j,1,n) if (size[j]%i==0) ++t;if (t==n/i) ++ans;}if (n!=1) printf("%d",ans+1);else printf("1"); }

總結(jié)

以上是生活随笔為你收集整理的树上摩托【NOIP2016提高A组模拟9.4】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。