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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定nnnddd,構造或判斷無法構造一棵二叉樹使得所有點的深度(定義為到根距離)之和為ddd

n,d≤5000n,d\leq 5000n,d5000

顯然可以算出有解的ddd的下界和上界,分別是完全二叉樹和鏈的情況。下面會證明在這個范圍內一定有解。

考慮增量,先構造出一條鏈,每次選一個葉結點接到深度小111的位置。

具體實現可以按編號暴力枚舉葉結點,然后暴力枚舉新位置的父親(即深度小222且兒子數<2<2<2)。如果找不到,因為它的祖先都遍歷過,感性理解,這個葉結點上面都放滿了,以后不可能再用,打上標記,下次增量的時候不訪問。

一棵二叉樹是完全二叉樹,當且僅當所有倒數第三深的點都已經有兩個兒子。所以不是完全二叉樹時可以按上面的方法增量。

復雜度看似是O(n(n2?d))O(n(n^2-d))O(n(n2?d)),但實際上ddd小于下界時可以直接輸出NO

顯然下界是O(nlog?n)O(n\log n)O(nlogn)的,也就是說只需要考慮nlog?n<dn\log n<dnlogn<d

變換得n<dlog?nn<\fracozvdkddzhkzd{\log n}n<lognd?

那么復雜度不劣于O((dlog?n)3)O((\fracozvdkddzhkzd{\log n})^3)O((lognd?)3)

d=5000d=5000d=5000,nnn最小只能到根號級別

加上算法復雜度不滿,可以通過

#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #define MAXN 5005 using namespace std; inline int read() {int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans; } int fa[MAXN],cnt[MAXN],sum[MAXN],dep[MAXN],bad[MAXN]; int main() {sum[1]=1;for (int i=2;i<MAXN;i++) sum[i]=i+sum[i/2]+sum[i-i/2-1];for (int i=1;i<MAXN;i++) sum[i]-=i;for (int T=read();T;T--){int n,d;n=read(),d=read();int cur=n*(n-1)/2;if (d<sum[n]||d>cur) {puts("NO");continue;}fa[1]=0;for (int i=2;i<=n;i++) fa[i]=i-1;for (int i=1;i<n;i++) cnt[i]=1;cnt[n]=0;for (int i=1;i<=n;i++) bad[i]=0,dep[i]=i-1;while (cur>d){int u;for (u=1;u<=n;u++)if (!cnt[u]&&!bad[u])break;bad[u]=1;for (int p=1;p<=n;p++)if (cnt[p]<2&&dep[u]-dep[p]==2){--cnt[fa[u]],fa[u]=p;dep[u]=dep[p]+1,++cnt[p];bad[u]=0,--cur;break;}}puts("YES");for (int i=2;i<=n;i++) printf("%d%c",fa[i]," \n"[i==n]);}return 0; }

總結

以上是生活随笔為你收集整理的【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。