簡要題意:給出乙個邊權為1或0的無向圖,求一顆生成樹,使得邊權和為斐波那契數。
這裡有乙個重要的結論:一張邊權為1或0的無向圖,如果權值p在最大生成樹權值與最小生成樹權值之間,那麼一定可以構造出一棵權值為p的生成樹。
這樣就好辦了。先求出最大生成樹與最小生成樹的權值,然後判斷這兩者之間是否有乙個斐波那契數就可以了。
詳見**。
#include#include#include#include#include#include#includeusing namespace std;
const int n = 100001;
struct node
}edge[n];
int fa[n];
long long fib[100];
int find(int x)
int main()
}if(cnt < n - 1)
//構造最大生成樹
cnt = 0;
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = m; i >= 1; i--)
}if(cnt < n - 1)
//兩者之間是否有乙個斐波那契
for(int i = 1; ; i++)
if(fib[i] >= mn && fib[i] <= mx) else if(fib[i] > mx)
// printf("%d %d\n", mx, mn);
} return 0;
}
最小生成樹 Hdu4786
hdu4786 最小生成樹的變形題,求一遍最小,求一遍最大,在從此區間是否含有斐波那契數,別忘了並查集,因為可能不連通。後來想其實不難,場上出不來的原還是對最小生成數不熟練,基礎薄弱。includeusing namespace std int par 100100 int rank 101000 ...
HDU 4786 斐波那契生成樹
這道題的意思是給你一些邊,某些邊被染成黑色,還有一些邊被染成白色,現在問你沒有乙個生成樹他的白邊的數量是斐波那契數列中的數,我們可以先選黑邊得到最最小的白邊數,先選白邊得到最大的白邊數,然後看看這個區間有沒有斐波那契數即可,注意沒有生成樹時的情況。如下 include include include...
題解 CF1485 簡要題解
奇怪的難度。當 b 2 的時候再操作,操作次數是一定的。因此 b 的變化量很小,暴力列舉。考慮哪個數不同,然後不同後可以選擇的區間是什麼。會發現中間夾著的區間選兩遍,旁邊的選一遍。做字首和好了。簡單轉化發現一定要滿足 a k b 1 k。列舉 b 貢獻式帶有乙個 min 找到其分割點,前一部分直接求...